# service-provider-interface **Repository Path**: hou-yaqiang/service-provider-interface ## Basic Information - **Project Name**: service-provider-interface - **Description**: 基于cursor生成的"Java SPI 机制示例项目" - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-14 - **Last Updated**: 2025-09-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Java SPI 机制示例项目 本项目是基于 [JavaGuide SPI机制详解](https://javaguide.cn/java/basis/spi.html) 文章创建的示例项目,用于演示Java SPI(Service Provider Interface)机制的工作原理。 ## 项目结构 ``` service-provider-interface/ ├── src/ │ ├── edu/ │ │ └── jiangxuan/ │ │ └── up/ │ │ ├── spi/ │ │ │ ├── Logger.java # SPI接口定义 │ │ │ ├── LoggerService.java # 服务使用者 │ │ │ ├── Main.java # 主程序演示 │ │ │ └── impl/ │ │ │ ├── LogbackLogger.java # Logback实现 │ │ │ └── Log4jLogger.java # Log4j实现 │ │ └── service/ │ │ └── MyServiceLoader.java # 自定义ServiceLoader │ └── META-INF/ │ └── services/ │ └── edu.jiangxuan.up.spi.Logger # SPI配置文件 └── README.md ``` ## SPI机制核心组件 ### 1. Logger接口 (SPI接口) - 定义了日志服务的标准接口 - 包含 `info()` 和 `debug()` 方法 ### 2. 服务实现类 - **LogbackLogger**: Logback日志框架的实现 - **Log4jLogger**: Log4j日志框架的实现 ### 3. LoggerService (服务使用者) - 使用JDK的 `ServiceLoader` 动态加载Logger实现 - 提供统一的日志服务接口 ### 4. META-INF/services配置文件 - 文件路径: `META-INF/services/edu.jiangxuan.up.spi.Logger` - 内容: 列出所有Logger接口的实现类 ### 5. MyServiceLoader (自定义实现) - 简化版的ServiceLoader实现 - 帮助理解SPI机制的工作原理 ## 运行方式 ### 编译项目 ```bash cd service-provider-interface/src javac -d . edu/jiangxuan/up/spi/*.java edu/jiangxuan/up/spi/impl/*.java edu/jiangxuan/up/service/*.java ``` ### 运行主程序 ```bash java edu.jiangxuan.up.spi.Main ``` ## 预期输出 ``` === Java SPI 机制演示 === 1. 使用JDK自带的ServiceLoader: [Logback] INFO: 这是一条info日志 [Logback] DEBUG: 这是一条debug日志 发现的所有Logger实现: - edu.jiangxuan.up.spi.impl.LogbackLogger - edu.jiangxuan.up.spi.impl.Log4jLogger ================================================== 2. 使用自定义的MyServiceLoader: File = /D:/workSpace/cursor/service-provider-interface/src/META-INF/services/edu.jiangxuan.up.spi.Logger 加载到的Logger实现数量: 2 实现类: edu.jiangxuan.up.spi.impl.LogbackLogger [Logback] INFO: 自定义加载器测试 - info [Logback] DEBUG: 自定义加载器测试 - debug 实现类: edu.jiangxuan.up.spi.impl.Log4jLogger [Log4j] INFO: 自定义加载器测试 - info [Log4j] DEBUG: 自定义加载器测试 - debug === SPI机制演示完成 === ``` ## SPI机制的优势 1. **解耦**: 服务接口和具体实现分离 2. **扩展性**: 可以动态添加新的实现 3. **可维护性**: 修改实现不需要修改调用方代码 4. **灵活性**: 支持多种实现并存 ## SPI机制的应用场景 - **JDBC驱动**: 数据库驱动的自动发现和加载 - **日志框架**: SLF4J、Logback、Log4j等 - **Spring框架**: 依赖注入和组件扫描 - **Dubbo框架**: 扩展点机制 ## 注意事项 1. SPI配置文件必须放在 `META-INF/services/` 目录下 2. 配置文件名必须是接口的全限定名 3. 配置文件内容每行一个实现类的全限定名 4. 实现类必须有无参构造函数 5. SPI机制通过反射实现,性能相对较低 ## 参考资料 - [JavaGuide SPI机制详解](https://javaguide.cn/java/basis/spi.html) - [Oracle SPI官方文档](https://docs.oracle.com/javase/tutorial/ext/basics/spi.html)