首页 > 编程语言 >Java---SPI机制

Java---SPI机制

时间:2024-11-17 09:45:14浏览次数:3  
标签:调用 Java 实现 接口 --- SPI 服务提供者 加载

何谓 SPI?

SPI 即 Service Provider Interface ,字面意思就是:“服务提供者的接口”,我的理解是:专门提供给服务提供者或者扩展框架功能的开发者去使用的一个接口。 比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦

SPI 将服务接口和具体的服务实现分离开来,将服务调用方和服务实现者解耦,能够提升程序的扩展性、可维护性。修改或者替换服务实现并不需要修改调用方。

很多框架都使用了 Java 的 SPI 机制,比如:Spring 框架、数据库加载驱动、日志接口、以及 Dubbo 的扩展实现等等。

|225

SPI 和 API 有什么区别?

那 SPI 和 API 有啥区别?

说到 SPI 就不得不说一下 API(Application Programming Interface) 了,从广义上来说它们都属于接口,而且很容易混淆。下面先用一张图说明一下:

SPI VS API|450

一般模块之间都是通过接口进行通讯,因此我们在服务调用方和服务实现方(也称服务提供者)之间引入一个“接口”。

  • 当实现方提供了接口和实现,我们可以通过调用实现方的接口从而拥有实现方给我们提供的能力,这就是 API。这种情况下,接口和实现都是放在实现方的包中。调用方通过接口调用实现方的功能,而不需要关心具体的实现细节。
  • 当接口存在于调用方这边时,这就是 SPI 。 由接口调用方确定接口规则,然后由不同的厂商根据这个规则对这个接口进行实现,从而提供服务。

举个通俗易懂的例子:公司 H 是一家科技公司,新设计了一款芯片,然后现在需要量产了,而市面上有好几家芯片制造业公司,这个时候,只要 H 公司指定好了这芯片生产的标准(定义好了接口标准),那么这些合作的芯片公司(服务提供者)就按照标准交付自家特色的芯片(提供不同方案的实现,但是给出来的结果是一样的)。

SPI机制的ServiceLoader是如何进行加载的

image.png

  1. 在ClassPath路径下的META-INF/services文件夹中,以接口的全限定名来命名文件名,对应的文件里面写该
    接口的实现。

  2. 在DriverManger类中使用ServiceLoader加载实现类,从线程上下文类加载器取出类加载器去创建Driver的实现类的对象

SPI 的优缺点?

通过 SPI 机制能够大大地提高接口设计的灵活性,但是 SPI 机制也存在一些缺点,比如:

  • 需要遍历加载所有的实现类,不能做到按需加载,这样效率还是相对较低的。
  • 当多个 ServiceLoader 同时 load 时,会有并发问题。

标签:调用,Java,实现,接口,---,SPI,服务提供者,加载
From: https://blog.csdn.net/weixin_73205368/article/details/143824745

相关文章

  • 南京邮电大学-鲁健
    一、个人简介        2021年9月就读于南京邮电大学自动化学院、人工智能学院智能科学与技术专业,主修人工智能方向的相关课程,极其擅长具身智能的相关开发,曾被誉为“原批之星”,最有希望颠覆三国杀的人之一。        志愿活动:参加2023年度自动化学院、人工智能......
  • 基于Java+Vue+MySQL的青少年信息学奥林匹克竞赛交流平台设计与实现(精选毕业设计-可设
    文章目录1.前言2.详细视频演示3.文档参考3.1论文参考3.2流程设计图3.3数据库表结构设计3.4系统测试部分4.项目运行截图5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue6.选题推荐毕设案例8.系统测试8.1系统测试的目的8.2系统功能测试9.代码参考10......
  • Java毕业设计-基于Springboot框架的电影推荐系统项目实战(附源码+论文)
    大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • 基于SSM + Vue的宠物店线上运营系统设计与实现(精选毕业设计-可设计亮点、创新点)
    文章目录1.前言2.详细视频演示3.文档参考3.1论文参考3.2流程设计图3.3数据库表结构设计3.4系统测试部分4.项目运行截图5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue6.选题推荐毕设案例8.系统测试8.1系统测试的目的8.2系统功能测试9.代码参考10......
  • Java毕业设计-基于Springboot框架的兴顺物流管理系统项目实战(附源码+论文)
    大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • 2024第四届京津冀长城杯-misc
    2024第四届京津冀长城杯-miscBrickGame就连连看或者改图标会快一点吧漏洞探踪,流量解密第一阶段192.168.30.234第二阶段bdb8e21eace81d5fd21ca445ccb35071bdb8e21eace81d5fd21ca445ccb350715a76f6751576dbe1af49328aa1d2d2bea16ef62afa3a7c616dbdb8e21eace81d5fd21ca445ccb35071......
  • wish easy-记一道re题
    wisheasy-记一道re题F5设置环境变量exportPYTHONINSPECT=111exportPYTHONUNBUFFERED=11运行一下flag{python_taken_2_far}......
  • DIDCTF-2022暑假取证学习
    DIDCTF-2022暑假取证学习1.请找出操作系统主机名WIN-49I0SNRJAMF2.请给出源磁盘的SHA256哈希值。这个软件没找到Autopsy这个软件计算时间太长了,就...3.请找出操作系统中安装的Android模拟器名称和安装日期。格式:模拟器名时间例子:雷电模拟器2022年06月23日夜神模拟器2021年05年03......
  • NSSRound#12 Basic-ordinary forensics
    NSSRound#12Basic-ordinaryforensics[NSSRound#12Basic]ordinaryforensicsvol.py-fforensics.raw--profile=Win7SP1x64cmdscan找到了一个密码U_find_1tvol.py-fforensics.raw--profile=Win7SP1x64filescan|grepzip·提取这个压缩包vol.py-fforensics.raw--profi......
  • 2024腾龙杯-easy_Forensics
    2024腾龙杯-easy_Forensicsvol.py-f3.img--profile=Win7SP1x64filescan|grep-E"png|zip|rar|jpg|txt"找到一张图片提取出来发现有压缩包分离出来解压得镜像导出来镜像里面是一个hint.txt打开是坐标,需要画图直接用gnuplot画图解码就行Hereisthevigenerekey:aeolus,bu......