ServiceLoader
今天在看 XML 解析获取 DocumentBuilderFactory 工厂时候发现,在 findServiceProvider() 中用到了 java.util.ServiceLoader 这个类来从配置文件中加载子类或者接口的实现类。以前从来没有使用过这个类,进去大概看了一下。
ServiceLoader使用
要想了解一个机制的原理,首先得知道它是怎么运行的,需要什么配置,才能运行起来。然后再分解来了解实现。对于技术实现也是一样,先看这个类是怎么实现的,先让它跑起来,看到效果。然后再讲原理。
按照使用说明文档,应该分下面几个步骤来使用:
- 创建一个接口文件
- 创建接口实现类
- 创建配制文件:
- 在 resources 资源目录下创建 META-INF/services 文件夹
- 在 services 文件夹中创建文件,以接口全名命名
我们想测试一下,一般是在这个工程中建立一个测试类来测试。来看下代码片段:
(1)接口:
public interface IMyServiceLoader {
String sayHello();
String getName();
}
(2)实现类:
public class MyServiceLoaderImpl1 implements IMyServiceLoader {
@Override
public String sayHello() {
return "hello1";
}
@Override
public String getName() {
return "name1";
}
}
public class MyServiceLoaderImpl2 implements IMyServiceLoader {
@Override
public String sayHello() {
return "hello2";
}
@Override
public String getName() {
return "name2";
}
}
(3)配制文件:
在 resources/META-INF/services 创建 util.IMyServiceLoader 文件,内容为实现类
util.MyServiceLoaderImpl1
(4)配制文件:最后来测试一下:
@Test
public void ServiceLoaderTest () {
ServiceLoader<IMyServiceLoader> serviceLoader = ServiceLoader.load(IMyServiceLoader.class);
for (IMyServiceLoader myServiceLoader : serviceLoader){
System.out.println(myServiceLoader.getName() + myServiceLoader.sayHello());
}
}