ServiceLoader的使用

获得接口的实现类有点困难

在Java中,由于反射的局限性,无法直接获取一个接口的所有实现子类,所以为了能够实现一个接口动态的注入实现的子类对象,需要借助ServiceLoader

简单的Demo使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

public interface IService {
void doSomeThing();
}

public class DefalutService implements IService{
@Override
public void doSomeThing() {
RzLogger.info("默认服务");
}
}

public class LogService implements IService {
@Override
public void doSomeThing() {
RzLogger.info("日志服务");
}
}


public static void main(String[] args) {
ServiceLoader<IService> loader = ServiceLoader.load(IService.class);
for (IService service : loader) {
service.doSomeThing();
}
}

如果直接运行,可以发现没有任何结果,需要在META-INF\services创建一个文件xxx.xxx.IService(是接口类的全类名) ,内容是两个子类的全类名:

1
2
learnJava.rz08.DefalutService
learnJava.rz08.LogService

再次运行结果:

1
2
21:55:48,873  INFO [main] (RzLogger.java:12) - 默认服务
21:55:48,877 INFO [main] (RzLogger.java:12) - 日志服务