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

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.kler.cn/news/109160.html

相关文章:

  • “破解我!“---160个CrackMe练习001-Acid buen.exe
  • 免费活动-11月4日敏捷武林上海站 | Scrum.org CEO 亲临现场
  • 深入理解Linux网络笔记(五):深度理解本机网络IO
  • 【技能树笔记】网络篇——练习题解析(十)
  • STM32-通用定时器
  • SpringBoot 整合 Nacos 实现统一配置中心
  • Azure云工作站上做Machine Learning模型开发 - 全流程演示
  • DVWA-SQL Injection SQL注入
  • 当『后设学习』碰上『工程学思维』
  • iOS iGameGuardian修改器检测方案
  • Python requests之Cookie
  • 大数据Flink(一百零五):SQL性能调优
  • 常见的配置文件格式:yaml,json,xml,ini,csv等
  • 一、灵动mm32单片机_开发环境的搭建(Keil)
  • jvm对象内存划分
  • C++设计模式_17_Mediator 中介者
  • 2023.10.28 关于 synchronized 原理
  • SDL事件处理以及线程使用(2)
  • 模型对象CSS2DObject始终在画布的左上角(问题解决)
  • LeetCode 541 反转字符串 II 简单
  • Python——PyQt5以及Pycharm相关配置
  • MyBatis的使用(XML映射文件)
  • review-java-basis
  • Centos7 Linux系统下生成https的crt和key证书
  • 【已解决】VSCode运行C#控制台乱码显示
  • IDE的组成
  • 解决:谷歌浏览器访问http时,自动转https访问的问题
  • Jtti:Apache服务的反向代理及负载均衡怎么配置
  • 宝塔安装mongodb插件失败的解决办法
  • RabbitMQ如何保证消息不丢失呢?