java从1.6开始引入了ServiceLoader工具类,用来实现服务提供者框架(SPI)。这个框架主要有三个组成部分:服务接口、提供者注册、服务访问。其中,服务接口是提供服务者要实现的。
具体使用的方向,有一点就是实现功能的可插拔性,可以在软件运行的过程中,随时更换组件而不耗费过多的精力。
比如有这个么一个人,每天都要出门去买早点,平常都是跑着去。但有一天生病了,必须要走着去了,有了我们的ServiceLoader,那实现这个功能,就再简单不过了。
首先我们要实现组件之一,服务接口,GoWay。
public interface GoWay {
String goWay();
}
然后,实现两个服务提供者,一个是Run,一个是Walk
public class Run implements GoWay {
public String goWay() {
return "I am Run";
}
}
public class Walk implements GoWay {
public String goWay() {
return "I am walk";
}
}
这时要想一下,怎么才能无缝切换走和跑两种买早点的方式呢。ServiceLoader提供了这种方式:在项目的文件管理中,新建以下路径 META-INF/services/,然后把服务接口的全称,也就是路径加名字,当作文件名,建立到该路径下,如图
内容就是想要使用的具体的实现的全名称。比如我们需要跑着去,那么配置如下:
我们使用main方法进行测试,代码如下:
public static void main(String[] args) {
ServiceLoader<GoWay> serviceLoader = ServiceLoader.load(GoWay.class);
serviceLoader.forEach(way->{
System.out.println(way.goWay());
});
}
结果如下:
这样,如果要改为走着去,可以很简单的修改配置中的实现类,就可以了。
配置中也可以配置多个方法,这个根据具体的业务进行合理的选择就可以了。