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

java中spi与api的区别

近期看了很多开源组件的源码,发现很多地方地方用到了 spi 的功能,开始思考 spi 与 api 的区别

发现 spi 侧重于抽象层次的概念,目前接触到的就是 java 里大量用到了这个,通过定义的接口来抽象通用的功能,然而 api 是不限编程语言限制的。例如自己写的很多调用方法(对应其他语言里的函数)。

API(Application Programming Interface)

应用程序编程接口,日常开发中大部分用的是这个

api,就是服务提供方定义的规范,自己必须遵守的。例如开发中使用了java语言以及一些第三方组件,规范是人家定义的,自己需要按照要求来调用对应 api 来完成自己想要的功能。

SPI(Service provider interface)

可以参见之前自己写的一篇文章中关于 spi 的讲解

https://blog.csdn.net/zlpzlpzyd/article/details/133899501

官网介绍

https://docs.oracle.com/javase%2Ftutorial%2F/sound/SPI-intro.html

看到一篇文章的讲解,从服务提供方与服务调用方来解释这个问题,感觉有道理

网易面试:什么是SPI,SPI和API有什么区别?

spi,是服务调用方定义的规范。具体例子有

注册中心与服务发现

spring-cloud-commons 就通过接口的形式定义了一套,其他的注册中心例如 eureka、consul、nacos 实现了对应的接口。

日志组件slf4j

slf4j通过门面模式整合了各种日志,例如 logback、log4j2 等其他日志。

servlet规范

对应的 servlet 容器有 tomcat、undertow、jetty 等。

jdbc 规范

对应的各个数据库厂商开发的各种数据库驱动。

上面这些 spi 就是跟 java 官方(除了jdbc规范在 java 官方自带 api里)无关了,一些民间组织根据市场上现有的一些组件进行功能抽象后通过一个抽象层次的接口来进行调用具体实现。

使用 spi 符合面向接口编程的理念,通过定义的接口规范来进行逻辑处理,降低程序之间的耦合。

有点类似于 spring boot 里的 @ConditioalXXX 注解。

总结下来,区别就是编程规范话语权在谁手里的问题。

api 的话语权在别人那里(对应编程语言官方的api和操作系统api),自己不能改,必须遵守别人的写法。

spi 的话语权在民间组织里,自己根据一些通用组件功能可以抽象出来一个规范(对应spring-cloud-commons、slf4j),只要别人愿意遵守这个即可。

参考链接

https://blog.csdn.net/qq_49662572/article/details/128435720

https://blog.csdn.net/JDDTechTalk/article/details/132764476

https://blog.csdn.net/weixin_59244784/article/details/130523170

https://blog.csdn.net/m0_71777195/article/details/132056741

http://www.lryc.cn/news/210905.html

相关文章:

  • 【Android知识笔记】插件化专题(二)
  • 赶紧收藏!史上最全IDEA快捷键大全
  • IntelliJ IDEA 把package包展开和压缩
  • Python——自动创建文件夹
  • Leetcode—21.合并两个有序链表【简单】
  • 数据链路层和DNS之间的那些事~
  • Spring-声明式事务
  • 腾讯云轻量服务器地域选择教程,一篇文章就够了
  • 【斗罗二】王东升级三环,戴华斌挑衅,雨浩单手接鼎订下赌约
  • 洛谷 B2135:单词替换
  • IDEA中application.properties文件中文乱码
  • Rust 模块系统
  • 面向服务架构-架构师(六十四)
  • Linux之系统编程
  • 信道数据传输速率、信号传播速度——参考《天勤计算机网络》
  • 微信小程序vue+uniapp旅游景点门票预订系统 名胜风景推荐系统
  • 每日一题之二分查找(一)
  • Redisson的看门狗策略——保障Redis数据安全与稳定的机制
  • 2.2 消元法的概念
  • 删除有序数组中的重复项
  • 【数据库】
  • 高级深入--day38
  • 基于springboot,vue校园社团管理系统
  • 广州华锐互动:VR虚拟现实物理学习平台,开启数字化教学新格局
  • 【tio-websocket】8、T-IO对半包和粘包的处理
  • 【Linux】安装与配置虚拟机及虚拟机服务器坏境配置与连接
  • Redis常识
  • Instant,LocalDate,LocalTime,LocalDateTime和ZonedDateTime
  • Web入门笔记
  • Linux网络编程二(TCP三次握手、四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)