SPI 简介
service provider interface JDK内置的中服务发现机制
一种动态替换发现的机制
使用方式
实现方式:
写service 具体对外提供的接口
public interface DriverService {
String getName();
}
具体的实现,继承对应的接口
public class JavaDriverImpl implements DriverService {
@Override
public String getName() {
return "java implement";
}
}
编写META-INF/service 具体的实现类 包名+类名
com.chengjue.spi.JavaDriverImpl
编译jar包对外提供服务
使用方:
引用相关依赖 jar包
使用ServiceLoader加载使用
public static void main(String[] args) {
ServiceLoader serviceLoader = ServiceLoader.load(DriverService.class);
for (DriverService driverService: serviceLoader){
System.out.println(driverService.getName());
}
}
实现原理
我们使用的时候都是使用的ServiceLoader加载服务,下面来看下ServiceLoader是具体怎么实现的
ServiceLoader是JDK提供的一个util,在java.uyil包下
我们可以看到他的介绍A simple service-provider loading facility.用来加载服务的
public final class ServiceLoader implements Iterable
我们可以看到他是一个final类型的,不可以被继承修改,同时实现了Iterable接口,方便我们使用迭代器取出所有的实现类