Java 中SPI(Service Provider Interface)是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现
它可以用来启用框架扩展和替换组件。常见的 SPI 有 JDBC、日志门面接口Spring、SpringBoot相关starter组件、Dubbo、JNDI等。
Java SPI 实际上是"基于接口的编程+策略模式+配置文件"组合实现的动态加载机制
案例
-
mysql中的Driver类
-
spring-web中也用到了
如何定义SPI:
1、定义一组接口 (假设是 org.foo.demo.IShout),并写出接口的一个或多个实现
示例
编写接口和接口实现类
public interface Annimal {
void voice();
}
public class Cat implements Annimal {
@Override
public void voice() {
System.out.println("这是动物的子类:猫");
}
}
public class Dog implements Annimal {
@Override
public void voice() {
System.out.println("这是一种很忠诚的动物:狗");
}
}
编写配置文件
在 src/main/resources/ 下建立 /META-INF/services 目录, 新增一个
以接口命名的文件(com.example.meas.entity.Annimal),内容是要应用的实现类(这里是com.example.meas.entity.Cat 和 com.example.meas.entity.Dog,每行一个类)
测试
@Test
public void spiTest(){
ServiceLoader<Annimal> shouts = ServiceLoader.load(Annimal.class);
for (Annimal s : shouts) {
s.voice();
}
}
打印结果:
这是动物的子类:猫
这是一种很忠诚的动物:狗
ServiceLoader是jdk中java.util中的类
评论区