SPI机制
SPI机制的全名是Service Provider Interface。
是JDK内置的一种服务提供发现机制,可以用来启动框架和替换组件,例如java.sql.Driver接口,其他不同厂商可以提供不同的实现,MySql和PostgreSQL,而Java的SPI机制可以为某个接口寻找服务实现。
Java的SPI机制的主要思想是将装配的控制权限移到程序之外,在模块化设计中这个机制尤为重要,器核心思想就是解耦。
是Java 6开始引入,是一种基于ClassLoader来发现并加载服务的机制。
- 组成
Service:公开的接口或抽象类,定义了一个抽象的功能模块。Service Provider:是Service接口的一个实现类。ServiceLoader:是SPI的核心组件,负责在运行时发现并加载Service Provider
- SPI机制
当一个服务提供了一个接口的实现后,需要在classPath的META-INF/services目录下创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的实现类。
- 使用
定义一个接口
package org.demo.spi;
public interface HelloSPI {
void sayHello();
}
定义实现类
package org.demo.spi;
public class ImageHello implements HelloSPI{
@Override
public void sayHello() {
System.out.println("image");
}
}
------
package org.demo.spi;
public class TextHello implements HelloSPI{
@Override
public void sayHello() {
System.out.println("text");
}
}
文件位置
文件内容
启动
package org.demo.spi;
import java.util.ServiceLoader;
public class Main {
public static void main(String[] args) {
final ServiceLoader<HelloSPI> helloSPIS = ServiceLoader.load(HelloSPI.class);
for (HelloSPI helloSPI : helloSPIS) {
helloSPI.sayHello();
}
}
}
- 规范
- 文件路径:必须在Jar包中的META-INF/services目录下
- 文件名称:Service接口的全限定名
- 文件内容:Service实现类ide全限定名,如果有多个实现类,那么每一个实现类在文件夹中单独占据一行