SPI 是 Service Provider Interface 的缩写,中文解释为服务提供发现接口
SPI 是一种「基于接口的编程 + 策略模式 + 配置文件」组合实现的动态加载机制,可以根据逻辑加载不通的接口实现
实现步骤:
- 在类路径下的
META-INF/services
目录下,创建以服务接口的 "全限定名" 命名的文件,文件的内容为接口实现类的全限定名,每行一个接口实现 - 实现类必须在当前程序的 classpath 下
- 使用
java.util.ServiceLoader
动态加载接口实现(ServiceLoader
会自动扫描 META-INF/services 下的配置文件加载实现类)
示例如下:
1、创建接口
package com.test.root.base.spi;
public class FirstSpiService implements SimpleSpiService {
@Override
public void say() {
System.out.println("Say first!");
}
}
2、实现接口
package com.test.root.base.spi;
public class FirstSpiService implements SimpleSpiService {
@Override
public void say() {
System.out.println("Say first!");
}
}
package com.test.root.base.spi;
public class SecondSpiService implements SimpleSpiService {
@Override
public void say() {
System.out.println("Say Second!");
}
}
3、创建 SPI 文件
SPI文件内容
com.test.root.base.spi.FirstSpiService
com.test.root.base.spi.SecondSpiService
2、加载并使用接口实现
package com.test.root.base.spi;
import java.util.ServiceLoader;
public class SpiTest {
public static void main(String[] args) {
ServiceLoader<SimpleSpiService> simpleSpiServices = ServiceLoader.load(SimpleSpiService.class);
for (SimpleSpiService simpleSpiService : simpleSpiServices) {
simpleSpiService.say();
}
}
}
标签:java,SPI,示例,接口,spi,test,root,public From: https://www.cnblogs.com/baokang/p/18532247