java如何调用spi
使用 Java SPI 的步骤
定义服务接口 创建一个接口作为服务提供者的契约,例如:
public interface MessageService {
String getMessage();
}
实现服务提供者
创建实现该接口的类,并在 META-INF/services 目录下创建以接口全限定名命名的文件(如 com.example.MessageService),文件内容为实现类的全限定名:
public class SimpleMessageService implements MessageService {
@Override
public String getMessage() {
return "Hello SPI";
}
}
文件内容示例:
com.example.SimpleMessageService
加载服务提供者
通过 ServiceLoader 加载并调用服务:
ServiceLoader<MessageService> loader = ServiceLoader.load(MessageService.class);
for (MessageService service : loader) {
System.out.println(service.getMessage());
}
注意事项
文件路径要求
服务提供者配置文件必须位于 META-INF/services 目录下,且文件名必须与接口的全限定名完全一致。
多实现处理
如果存在多个服务提供者实现,ServiceLoader 会按配置文件的顺序加载所有实现类。
模块化支持
在 Java 9+ 模块化系统中,需要在 module-info.java 中声明服务提供关系:

provides com.example.MessageService with com.example.SimpleMessageService;
线程安全
ServiceLoader 不是线程安全的,多线程环境下需要自行实现同步机制。






