`

java.util.ServiceLoader使用

阅读更多

今天在看Hadoop源代的时候发现,在FileSystem中用到了java.util.ServiceLoader这个类来从配置文件中加载子类或者接口的实现类。

以前从来没有使用过这个类,进去大概看了一下具体的实现。主要是从META-INF/services这个目录下的配置文件加载给定接口或者基

类的实现,ServiceLoader会根据给定的类的full name来在META-INF/services下面找对应的文件,在这个文件中定义了所有这个类的

子类或者接口的实现类,返回一个实例。


下面以一个具体的例子来说明一下ServiceLoader的具体使用,类似Hadoop FileSystem中的实现。

首先定义一个接口,具体如下:

public interface IService {
public String sayHello();

public String getScheme();
}

该接口有两个子类,分别为HDFSService和LocalService:

public class HDFSService implements IService {

@Override
public String sayHello() {
return "Hello HDFS!!";
}

@Override
public String getScheme() {
return "hdfs";
}
}

public class LocalService implements IService {

@Override
public String sayHello() {
return "Hello Local!!";
}

@Override
public String getScheme() {
return "local";
}

}

需要在META-INF/services下以IService这个类的全名来新建立一个文件,文件中的内容为两个实现类的全名,如下:

org.hadoop.java.HDFSService
org.hadoop.java.LocalService

所有的实现和配置都已经完成,下面写一个测试类来看一下结果:

public class ServiceLoaderTest {

/**
* @param args
*/
public static void main(String[] args) {
//need to define related class full name in /META-INF/services/....
ServiceLoader<IService> serviceLoader = ServiceLoader
.load(IService.class);
for (IService service : serviceLoader) {
System.out.println(service.getScheme()+"="+service.sayHello());
}
}

}

分享到:
评论

相关推荐

    java.util.ServiceLoader demo

    ServiceLoader&lt;MyService&gt; loader = ServiceLoader.load(MyService.class); for (MyService service : loader) { service.doSomething(); } ``` ### 4. 动态加载与懒加载 `ServiceLoader`实现了迭代器模式,可以...

    JavaServiceProviderInterfaceDemo:Java 的 SPI(服务提供者接口)和 java.util.ServiceLoader 使用的简单演示

    Java 的 SPI(服务提供者接口)和 java.util.ServiceLoader 使用的简单演示。 介绍 这个演示应用程序包括 6 个小 jar 项目。 云服务 演示伪“云服务”提供者。 为服务提供者定义spidemo.cloud.spi.Cloud接口。 ...

    spring-boot-java-util-service-loader:使用java.util.ServiceLoader的示例Spring Boot应用程序在类路径上动态加载所有SPI实现

    使用java.util.ServiceLoader示例Spring Boot应用程序在类路径上动态加载所有实现。 多项目Gradle构建 1个Spring Boot应用 1个SPI项目 2个SPI实施项目 有关java.util.ServiceLoader用法,请参见app/src/test/java/...

    ServiceLoader的使用

    - 服务加载器默认按配置文件中的顺序加载服务提供者,如果需要自定义加载顺序,需要实现`java.util.ServiceLoader.Provider`接口。 - `ServiceLoader`的加载过程只执行一次,如果需要多次加载,需要调用`reload()`...

    textrazor-1.0.1.zip

    service-plugin-loader.zip,在java.util.Serviceloader基础上构建的java.util.Serviceloader服务插件加载器的包装。它用于发现和加载作为应用程序扩展/插件的服务。

    java-service-spi-example:Java SPI(服务提供者示例)

    java.util.ServiceLoader类从 Java 编程语言的第 6 版开始就java.util.ServiceLoader ,它允许您在应用程序中访问和使用不同的服务提供者。 例如,假设服务作者为我们提供了一个名为RandomServiceProvider的接口;...

    denominator-dynect-4.0.1.zip

    abstract-service-loader.zip,抽象实现包装java.util.service loader以基于META-INF/services entriesAbstract service loader类包装java.util.serviceloader

    Java 服务器信息监控

    Java的`java.util.ServiceLoader`可以帮助我们发现和加载服务,而`java.lang.management.ManagementFactory`可以获取应用的运行时信息,如线程状态、类加载情况等。 为了实现一个全面的服务器监控系统,开发者还...

    jdk spi机制

    除了基本的SPI机制,还可以通过自定义`java.util.ServiceLoader.Provider-Implementation`元数据来控制服务加载行为,或者使用第三方库如Apache Commons Lang的`ClassUtils`进行更复杂的类加载操作。 总之,JDK的...

    通过SPI实现动态加载外部jar的实现类

    此外,SPI还支持使用自定义加载器,可以通过实现`java.util.ServiceLoader.Provider`接口来自定义加载逻辑。同时,`java.util.ServiceConfigurationError`异常用于处理配置错误,如找不到配置文件或配置文件格式错误...

    java spi实现工程

    ServiceLoader&lt;MyService&gt; loader = ServiceLoader.load(MyService.class); for (MyService service : loader) { service.doSomething(); } ``` 5. **优点** - **可扩展性**:允许第三方开发者扩展应用功能,...

    SPI示例代码及实现方式

    ServiceLoader&lt;Calculator&gt; loader = ServiceLoader.load(Calculator.class); for (Calculator calculator : loader) { System.out.println("Calculator: " + calculator.getClass().getName()); System.out....

    Android代码-WMRouter

    WMRouter是一款Android路由框架,基于组件化的...基于SPI (Service Provider Interfaces) 的设计思想,WMRouter提供了ServiceLoader模块,类似Java中的java.util.ServiceLoader,但功能更加完善。通过ServiceLoader可

    SPI入门级Demo(三:服务实现者-加法服务)

    4. **加载服务**:在主程序中,使用`ServiceLoader.load()`方法加载服务。`ServiceLoader`会自动读取配置文件并实例化所有的服务实现者。 ```java import java.util.ServiceLoader; public class SPIConsumer { ...

    java时区问题

    7. **网络时区同步**:如果需要确保时区数据是最新的,可以使用`tzdata`更新工具或Java的`java.util.ServiceLoader`机制加载外部的时区数据提供者。 了解和熟练掌握这些知识点,可以帮助开发者更准确地处理Java中的...

    Java JDK 6.0基础学习笔记.rar

    还有`java.util.ServiceLoader`,方便加载和使用服务提供者接口。 总的来说,"Java JDK 6.0基础学习笔记"会涵盖这些核心概念,并可能通过实例演示如何使用它们。PPT简体版的学习资料将图文并茂地解释这些知识点,...

    spi-Demo.rar

    ServiceLoader&lt;MyService&gt; loader = ServiceLoader.load(MyService.class); for (MyService service : loader) { service.doSomething(); } ``` 6. **优势**:SPI使得框架或库可以在不依赖具体实现的情况下...

    Java的Spi使用实例

    在`java.util.ServiceLoader`类的帮助下,我们可以方便地加载并使用这些服务提供者。下面我们将详细探讨Java SPI的工作原理、如何创建和使用SPI服务,以及一个具体的`SpiDemo`实例。 1. **SPI工作原理** - **配置...

    SPI入门级Demo(四:服务实现者-乘法服务)

    ServiceLoader&lt;Multiplier&gt; loader = ServiceLoader.load(Multiplier.class); for (Multiplier multiplier : loader) { System.out.println("Multiplication result: " + multiplier.multiply(5, 3)); } } } ``...

Global site tag (gtag.js) - Google Analytics