当前位置: 首页 > news >正文

什么是SPI,和API有啥区别

Java 中区分 API 和 SPI,通俗的讲:API 和 SPI 都是相对的概念,他们的差别只在语义上,API 直接被应用开发人员使用,SPI 被框架扩展人员使用。


API (Application Programming Interface)

        定义: API是一组定义了软件组件之间交互的规则和约定的接口。提供方来制定接口并完成对接口的不同实现,调用方只需要调用即可。

        用途: 主要用于为外部开发者(应用程序开发者)提供功能访问入口,简化集成过程。例如,Java标准库中的集合框架、网络编程接口等都是API的例子。

        使用者: 通常由应用程序开发者使用,以调用特定功能或服务。

SPI (Service Provider Interface)

        定义: SPI是一种特殊类型的接口,用于服务的提供者和消费者之间动态解耦。它允许第三方为一个已存在的接口提供多种实现,并且这些实现可以在运行时被发现和加载,从而实现了高度的可插拔性和扩展性。

SPI是一种扩展机制,通常用于在应用程序中提供可插拔的实现。 调用方可选择使用提供方提供的内置实现,也可以自己实现。

        用途: SPI主要用于实现模块化设计,特别是在需要支持插件或服务替换的场景下。例如,日志框架(如Log4j、SLF4J)或数据库驱动程序常常利用SPI机制,让最终用户能够在不修改应用程序代码的情况下更换实现。

        使用者: 通常由服务提供者(如库、框架的开发者)实现,而服务消费者(可能是应用开发者或其他框架)则通过SPI机制发现并使用这些实现。

主要区别

        目的不同: API关注于暴露功能给外部使用,简化与系统的交互;SPI关注于提供一种机制,使得系统可以在运行时发现和使用不同的服务实现。

        使用者不同: API主要面向应用开发者,SPI主要面向服务或组件的提供者。

        动态性不同: API的使用相对静态,通常在编译时确定;而SPI支持动态发现和加载服务实现,具有更高的灵活性和扩展性。

所以说,API 是面向普通开发者的,提供一组功能,使他们可以利用一个库或框架来实现具体的功能。而SPI 是面向那些希望扩展或定制基础服务的开发者的,它定义了一种机制,让其他开发者可以提供新的实现或扩展现有的功能。

相关文章:

  • RustGUI学习(iced/iced_aw)之扩展小部件(二十七):如何使用number_input部件?
  • 嵌入式0基础开始学习 ⅠC语言(2)运算符与表达式
  • 移动云以深度融合之服务,令“大”智慧贯穿云端
  • mysql IF语句,模糊检索
  • Python——二维字典
  • MybatisPlus中自定义sql
  • 【数据结构】二叉树的认识与实现
  • BGP策略实验(路径属性和选路规则)
  • C# 集合(六) —— 自定义集合Collection类
  • 音视频开发8 音视频中SDL的使用,SDL 在windows上环境搭建,SDL 使用 以及 常用 API说明,show YUV and play PCM
  • C++第十七弹---string使用(下)
  • 详细分析Element Plus中的ElMessageBox弹窗用法(附Demo及模版)
  • Java 三种主流的消息中间件 RabbitMQ、Kafka 和 RocketMQ 特点以及适用,使用场景 学习总结
  • 【设计模式】JAVA Design Patterns——Command(事务模式)
  • MySQL视图教程(01):创建视图
  • Elasticsearch 参考指南(升级前重新索引)
  • Java IO学习笔记一
  • JDK 6和JDK 7中的substring()方法
  • Python学习之路13-记分
  • socket.io+express实现聊天室的思考(三)
  • Tornado学习笔记(1)
  • Vue.js-Day01
  • 百度地图API标注+时间轴组件
  • 从PHP迁移至Golang - 基础篇
  • 解决iview多表头动态更改列元素发生的错误
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 入门到放弃node系列之Hello Word篇
  • 算法-图和图算法
  • 我是如何设计 Upload 上传组件的
  • 在Unity中实现一个简单的消息管理器
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​HTTP与HTTPS:网络通信的安全卫士
  • # C++之functional库用法整理
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (1)SpringCloud 整合Python
  • (70min)字节暑假实习二面(已挂)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Java入门)抽象类,接口,内部类
  • (多级缓存)缓存同步
  • (二)springcloud实战之config配置中心
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (转载)虚函数剖析
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • ./和../以及/和~之间的区别
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net Stream篇(六)
  • .so文件(linux系统)
  • @private @protected @public
  • [20170705]diff比较执行结果的内容.txt