今天在看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());
}
}
}
分享到:
相关推荐
ServiceLoader<MyService> loader = ServiceLoader.load(MyService.class); for (MyService service : loader) { service.doSomething(); } ``` ### 4. 动态加载与懒加载 `ServiceLoader`实现了迭代器模式,可以...
Java 的 SPI(服务提供者接口)和 java.util.ServiceLoader 使用的简单演示。 介绍 这个演示应用程序包括 6 个小 jar 项目。 云服务 演示伪“云服务”提供者。 为服务提供者定义spidemo.cloud.spi.Cloud接口。 ...
使用java.util.ServiceLoader示例Spring Boot应用程序在类路径上动态加载所有实现。 多项目Gradle构建 1个Spring Boot应用 1个SPI项目 2个SPI实施项目 有关java.util.ServiceLoader用法,请参见app/src/test/java/...
- 服务加载器默认按配置文件中的顺序加载服务提供者,如果需要自定义加载顺序,需要实现`java.util.ServiceLoader.Provider`接口。 - `ServiceLoader`的加载过程只执行一次,如果需要多次加载,需要调用`reload()`...
service-plugin-loader.zip,在java.util.Serviceloader基础上构建的java.util.Serviceloader服务插件加载器的包装。它用于发现和加载作为应用程序扩展/插件的服务。
java.util.ServiceLoader类从 Java 编程语言的第 6 版开始就java.util.ServiceLoader ,它允许您在应用程序中访问和使用不同的服务提供者。 例如,假设服务作者为我们提供了一个名为RandomServiceProvider的接口;...
abstract-service-loader.zip,抽象实现包装java.util.service loader以基于META-INF/services entriesAbstract service loader类包装java.util.serviceloader
Java的`java.util.ServiceLoader`可以帮助我们发现和加载服务,而`java.lang.management.ManagementFactory`可以获取应用的运行时信息,如线程状态、类加载情况等。 为了实现一个全面的服务器监控系统,开发者还...
除了基本的SPI机制,还可以通过自定义`java.util.ServiceLoader.Provider-Implementation`元数据来控制服务加载行为,或者使用第三方库如Apache Commons Lang的`ClassUtils`进行更复杂的类加载操作。 总之,JDK的...
此外,SPI还支持使用自定义加载器,可以通过实现`java.util.ServiceLoader.Provider`接口来自定义加载逻辑。同时,`java.util.ServiceConfigurationError`异常用于处理配置错误,如找不到配置文件或配置文件格式错误...
ServiceLoader<MyService> loader = ServiceLoader.load(MyService.class); for (MyService service : loader) { service.doSomething(); } ``` 5. **优点** - **可扩展性**:允许第三方开发者扩展应用功能,...
ServiceLoader<Calculator> loader = ServiceLoader.load(Calculator.class); for (Calculator calculator : loader) { System.out.println("Calculator: " + calculator.getClass().getName()); System.out....
WMRouter是一款Android路由框架,基于组件化的...基于SPI (Service Provider Interfaces) 的设计思想,WMRouter提供了ServiceLoader模块,类似Java中的java.util.ServiceLoader,但功能更加完善。通过ServiceLoader可
4. **加载服务**:在主程序中,使用`ServiceLoader.load()`方法加载服务。`ServiceLoader`会自动读取配置文件并实例化所有的服务实现者。 ```java import java.util.ServiceLoader; public class SPIConsumer { ...
7. **网络时区同步**:如果需要确保时区数据是最新的,可以使用`tzdata`更新工具或Java的`java.util.ServiceLoader`机制加载外部的时区数据提供者。 了解和熟练掌握这些知识点,可以帮助开发者更准确地处理Java中的...
还有`java.util.ServiceLoader`,方便加载和使用服务提供者接口。 总的来说,"Java JDK 6.0基础学习笔记"会涵盖这些核心概念,并可能通过实例演示如何使用它们。PPT简体版的学习资料将图文并茂地解释这些知识点,...
ServiceLoader<MyService> loader = ServiceLoader.load(MyService.class); for (MyService service : loader) { service.doSomething(); } ``` 6. **优势**:SPI使得框架或库可以在不依赖具体实现的情况下...
在`java.util.ServiceLoader`类的帮助下,我们可以方便地加载并使用这些服务提供者。下面我们将详细探讨Java SPI的工作原理、如何创建和使用SPI服务,以及一个具体的`SpiDemo`实例。 1. **SPI工作原理** - **配置...
ServiceLoader<Multiplier> loader = ServiceLoader.load(Multiplier.class); for (Multiplier multiplier : loader) { System.out.println("Multiplication result: " + multiplier.multiply(5, 3)); } } } ``...