API 与 SPI 的区别
定义
| 对比项 | API(Application Programming Interface) | SPI(Service Provider Interface) |
|---|---|---|
| 定义 | 应用程序接口,是预先定义的函数、协议或工具集,供开发者调用以实现特定功能。 | 服务提供者接口,是一种框架或平台定义的接口规范,允许第三方实现并注册到系统中,供框架动态发现和调用。 |
| 核心目标 | 封装底层实现,提供标准化调用方式,降低开发复杂度。 | 解耦框架与具体实现,支持动态扩展和插件化。 |
目的与使用场景
| 对比项 | API | SPI |
|---|---|---|
| 目的 | 为开发者提供调用现有功能的接口(如操作系统、库函数)。 | 允许开发者向框架/平台注入自定义实现(如日志、数据库驱动)。 |
| 使用场景 | 开发者主动调用接口完成功能(如调用 HttpClient 发送请求)。 | 框架主动扫描并调用注册的服务(如 Java 的 ServiceLoader 加载日志实现)。 |
| 依赖方向 | 应用依赖 API 的实现。 | 框架依赖 SPI 的实现。 |
实现方式
| 对比项 | API | SPI |
|---|---|---|
| 实现主体 | 由库或框架提供,开发者直接调用。 | 由开发者实现,需遵循框架定义的接口规范。 |
| 调用方式 | 显式调用(如调用 List.add())。 | 隐式调用(框架通过反射或配置文件发现并调用)。 |
| 典型示例 | JDBC API(Connection、Statement)RESTful API(HTTP 接口) | Java 的日志系统(java.util.logging.LoggingMXBean)JDBC 驱动注册( DriverManager) |
核心区别
| 对比项 | API | SPI |
|---|---|---|
| 主动性 | 开发者主动调用。 | 框架主动发现并调用。 |
| 扩展性 | 功能固定,依赖库的版本。 | 支持动态扩展,可插入自定义实现。 |
| 依赖关系 | 应用依赖 API 的实现。 | SPI 实现依赖框架的加载机制。 |
相关问题与解答
问题 1:API 和 SPI 能否同时存在?
解答:
可以同时存在,Java 的 JDBC 既是 API(开发者调用 DriverManager.getConnection()),也是 SPI(数据库厂商实现 Driver 接口并通过 ServiceLoader 注册),API 提供标准调用方式,SPI 实现具体功能扩展。

问题 2:如何实现一个 SPI?
解答:
以 Java 的 ServiceLoader 为例:

- 定义 SPI 接口:创建接口(如
com.example.Logger)。 - 实现接口:编写实现类(如
Com.example.ConsoleLogger)。 - 注册服务:在
META-INF/services/com.example.Logger文件中声明实现类全路径。 - 框架调用:框架通过
ServiceLoader.load(Logger.class)加载并调用实现。
- API 是“消费端”视角,关注如何调用功能。
- SPI 是“提供者”视角,关注如何向框架注入功能。
- 典型场景:API 用于业务逻辑开发,SPI 用于框架扩展(如
到此,以上就是小编对于“api spi 区别”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。

【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复