Java SPI(Service Provider Interface)是一种用于发现和加载服务实现的机制。它允许框架和库通过配置文件动态地发现和加载具体的服务实现,而无需在代码中显式引用实现类。
1.主要角色
- Service Provider Interface (SPI): 定义服务的接口或抽象类。
- Service Provider: 提供服务的具体实现类。
- Service Loader: 用于查找并加载服务提供者的工具类(java.util.ServiceLoader)
2. 使用 Java SPI 的步骤
- 定义服务接口
这个接口就是SPI
public interface MyService {
void execute();
}
- 实现服务接口
public class MyServiceImpl implements MyService {
@Override
public void execute() {
System.out.println("Executing MyServiceImpl");
}
}
- 创建服务提供者配置文件
在META-INF/services目录下创建一个以服务接口的全限定名命名的文件,文件内容是服务提供者实现类的全限定名.
例如META-INF/services/com.example.MyService的内容
com.example.MyServiceImpl
- 使用
ServiceLoader加载服务实现
使用 ServiceLoader 动态加载并使用服务提供者
import java.util.ServiceLoader;
public class Main {
public static void main(String[] args) {
ServiceLoader<MyService> serviceLoader = ServiceLoader.load(MyService.class);
for (MyService service : serviceLoader) {
service.execute();
}
}
}