什么是SPI?
SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的机制, 比如有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。我们经常遇到的就是java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,mysql和postgresql都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。
SPI的用途
数据库DriverManager、Spring、ConfigurableBeanFactory等都用到了SPI机制,这里以数据库DriverManager为例,看一下其实现的内幕。
DriverManager是jdbc里管理和注册不同数据库driver的工具类。针对一个数据库,可能会存在着不同的数据库驱动实现。我们在使用特定的驱动实现时,不希望修改现有的代码,而希望通过一个简单的配置就可以达到效果。 在使用mysql驱动的时候,会有一个疑问,DriverManager是怎么获得某确定驱动类的?我们在运用Class.forName(“com.mysql.jdbc.Driver”)加载mysql驱动后,就会执行其中的静态代码把driver注册到DriverManager中,以便后续的使用。
示例
api模块中定义一个接口
public interface Testervice {
String demo(String params);
}
demo-api中实现其接口
在其resource目录下创建文件
com.keyten.api.service.Testervice是api下接口包名+类名,
com.example.demospi.demo.Demo 是其实现类
producer模块中调用,
public class Load {
private Load(){}
private static Testervice testervice;
static {
ServiceLoader<Testervice> load = ServiceLoader.load(Testervice.class);
for (Testervice testervice1 : load) {
if (testervice1 !=null) testervice = testervice1;
}
}
public static Testervice getTestervice() {
return testervice;
}
}
public static void main(String[] args) {
Testervice testervice = Load.getTestervice();
String aaa = testervice.demo("aaa");
System.out.println(aaa);
}