SPI定义
SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。
常见例子:
JDBC加载不同的数据库驱动
日志框架加载不同厂商的日志实现
....
SPI使用:
- 接口实现者,必须在自身jar包的META-INF/services目录下创建一个以实现接口全限定名称命名的文件,内容为实现类的全限定名,如果有多个实现类,需按行写入
- 实现类必须有一个无参构造
- 调用方程序通过
java.util.ServiceLoader
动态加载实现类到JVM中
示例代码
- 定义接口
public interface TestInterface {
void process(Object... args);
}
项目结构
- 实现接口
public class SpiInstance implements TestInterface {
@Override
public void process(Object... args) {
System.out.println("SPI INSTANCE");
if (null != args){
for (Object arg : args) {
System.out.println(arg);
}
}
}
}
-
创建配置文件
文件名称:young.spi.TestInterface
文件内容:young.spiinstance.SpiInstance
项目结构:
-
加载接口
public static void main(String[] args) {
ServiceLoader<TestInterface> load = ServiceLoader.load(TestInterface.class);
for (TestInterface testInterface : load) {
System.out.println(testInterface.getClass().getName());
testInterface.process("test spi");
}
}
运行结果:
项目结构: