



























Java SPI(Service Provider Interface)是一种服务发现机制,允许第三方为接口提供实现,实现解耦和动态扩展。核心流程:
META-INF/services中配置)ServiceLoader加载服务// 文件路径: src/main/java/com/example/LogService.java
package com.example;
public interface LogService {
void log(String message);
}
// 文件路径: src/main/java/com/example/ConsoleLogger.java
package com.example;
public class ConsoleLogger implements LogService {
@Override
public void log(String message) {
System.out.println("[Console] " + message);
}
}
// 文件路径: src/main/java/com/example/FileLogger.java
package com.example;
public class FileLogger implements LogService {
@Override
public void log(String message) {
System.out.println("[File] Log saved: " + message); // 模拟写入文件
}
}
在资源目录创建文件:
src/main/resources/META-INF/services/com.example.LogService
内容为实现类的全限定名:
com.example.ConsoleLogger
com.example.FileLogger
// 文件路径: src/main/java/com/example/MainApp.java
package com.example;
import java.util.ServiceLoader;
public class MainApp {
public static void main(String[] args) {
// 加载所有LogService实现
ServiceLoader<LogService> loggers = ServiceLoader.load(LogService.class);
// 遍历并调用服务
for (LogService logger : loggers) {
logger.log("Hello SPI!");
}
}
}
[Console] Hello SPI!
[File] Log saved: Hello SPI!
META-INF/services/接口全限定名(无文件后缀)ServiceLoader通过线程上下文类加载器查找所有META-INF/services下的注册信息DriverManager)| 方式 | SPI机制 | 普通接口调用 |
|---|---|---|
| 耦合度 | 实现类可独立扩展,完全解耦 | 需显式依赖具体实现 |
| 新增实现 | 添加JAR包即生效 | 需修改调用方代码 |
| 依赖关系 | 调用方只依赖接口 | 调用方依赖接口+具体实现 |
提示:在Spring Boot中,
spring.factories机制是SPI的增强版,原理类似但支持更复杂的自动配置场景。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。