0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SPI是什么?Java SPI的使用介绍

OSC开源社区 来源:OSCHINA 社区 2023-09-02 09:58 次阅读

SPI 是什么

SPI 全称 Service Provider Interface,是 Java 提供的一套用来被第三方实现或者扩展的 API,它可以用来启用框架扩展和替换组件。

整体机制如下图

507ef174-48b5-11ee-97a6-92fbcf53809c.png

Java SPI 实际上是 “基于接口编程+策略模式+配置文件” 组合实现的动态加载机制。

使用场景

适用于:调用者根据实际使用需要,启用、扩展、或者替换框架的实现策略

比较常见的例子:

数据库驱动加载接口实现类的加载,JDBC 加载不同类型数据库的驱动

日志门面接口实现类加载,SLF4J 加载不同提供商的日志实现类

Spring 中大量使用了 SPI, 比如:对 servlet3.0 规范对 ServletContainerInitializer 的实现、自动类型转换 Type Conversion SPI (Converter SPI、Formatter SPI) 等

Dubbo 中也大量使用 SPI 的方式实现框架的扩展,不过它对 Java 提供的原生 SPI 做了封装,允许用户扩展实现 Filter 接口

使用介绍

要使用 Java SPI,需要遵循如下约定:

当服务提供者提供了接口的一种具体实现后,在 jar 包的 META-INF/services 目录下创建一个以 “接口全限定名” 为命名的文件,内容为实现类的全限定名;

接口实现类所在的 jar 包放在主程序的 classpath 中;

主程序通过 java.util.ServiceLoder 动态装载实现模块,它通过扫描 META-INF/services 目录下的配置文件找到实现类的全限定名,把类加载到 JVM;

SPI 的实现类必须携带一个不带参数的构造方法;

总结

优点:使用 Java SPI 机制的优势是实现解耦,使得第三方服务模块的装配控制的逻辑与调用者的业务代码分离,而不是耦合在一起。应用程序可以根据实际业务情况启用框架扩展或替换框架组件。

缺点:

虽然 ServiceLoader 也算是使用的延迟加载,但是基本只能通过遍历全部获取,也就是接口的实现类全部加载并实例化一遍。如果你并不想用某些实现类,它也被加载并实例化了,这就造成了浪费。获取某个实现类的方式不够灵活,只能通过 Iterator 形式获取,不能根据某个参数来获取对应的实现类。

多个并发多线程使用 ServiceLoader 类的实例是不安全的。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动器
    +关注

    关注

    51

    文章

    7308

    浏览量

    142962
  • SPI接口
    +关注

    关注

    0

    文章

    251

    浏览量

    33934
  • JAVA语言
    +关注

    关注

    0

    文章

    138

    浏览量

    19943
  • JVM
    JVM
    +关注

    关注

    0

    文章

    152

    浏览量

    12129
  • 解耦控制
    +关注

    关注

    0

    文章

    29

    浏览量

    10174

原文标题:浅析 Java - SPI 机制

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    JAVA操作英创主板SPI接口简介

    访问硬件资源,英创提供了Java硬件支持包,主要支持的工控接口有:以太网、串口、CAN、GPIO、SPI、I2C、RTC等。本文主要介绍使用Java语言调用英创
    发表于 10-20 13:16

    SPI接口总线介绍

    SPI接口总线介绍 SPI 可以作为主、从器件工作,并可在同一总线上支持多个主、从器件。SPI 主要使用3 个信号。(1)主输出、从
    发表于 11-24 08:41 4636次阅读
    <b class='flag-5'>SPI</b>接口总线<b class='flag-5'>介绍</b>

    SPI总线简介与参考实例

    spi协议介绍,通过文档形式说明spi总线时序
    发表于 11-19 15:12 55次下载

    SPI总线协议介绍

    这是SPI协议的介绍,很有用的哦,欢迎大家下载。
    发表于 04-13 14:21 17次下载

    SPI接口的应用与基于FPGA的SPI自动发送模块设计

    SPI 接口应用十分广泛,在很多情况下,人们会用软件模拟的方法来产生SPI 时序或是采用带SPI 功能模块的MCU。但随着可编程逻辑技术的发展,人们往往需要自己设计简单的SPI 发送模
    发表于 10-19 10:33 19次下载
    <b class='flag-5'>SPI</b>接口的应用与基于FPGA的<b class='flag-5'>SPI</b>自动发送模块设计

    spi从机程序设计_spi从机程序代码详细介绍

    本文介绍STM32F407的SPI主从机通信程序和基于计数器的spi从机程序这两种spi从机程序
    发表于 12-29 15:05 3.3w次阅读
     <b class='flag-5'>spi</b>从机程序设计_<b class='flag-5'>spi</b>从机程序代码详细<b class='flag-5'>介绍</b>

    英创信息技术JAVA操作英创主板SPI接口简介

    资源,英创提供了Java硬件支持包,主要支持的工控接口有:以太网、串口、CAN、GPIO、SPI、I2C、RTC等。本文主要介绍使用Java语言调用英创
    的头像 发表于 02-06 11:09 1516次阅读
    英创信息技术<b class='flag-5'>JAVA</b>操作英创主板<b class='flag-5'>SPI</b>接口简介

    SPI基础,SPI是怎么样的?

    SPI是一种简单的接口,允许一个芯片与一个或多个其他芯片进行通信。 1,SPI是怎么样的? 让我们从一个简单的示例开始,其中只有两个芯片必须一起通信。 SPI要求在两个芯片之间使用4条线。 如您所见
    的头像 发表于 11-19 18:06 4464次阅读

    spi协议介绍

    文章目录前言一、SPI介绍1.SPI总线2.寻址方式二、通信原理1.通信过程2.极性和相位3.四种工作模式三、SPI与I2C的异同1.相同点2.不同点总结前言
    发表于 12-22 19:21 19次下载
    <b class='flag-5'>spi</b>协议<b class='flag-5'>介绍</b>

    源码级深度理解Java SPI

    SPI 配置:Java SPI 机制约定的配置文件,提供查找服务实现类的逻辑。配置文件必须置于 META-INF/services 目录中,并且,文件名应与服务提供者接口的完全限定名保持一致。文件中的每一行都有一个实现服务类的详
    的头像 发表于 11-15 11:38 460次阅读

    Java中的SPI动态扩展(下)

    基本上,你一说是基于spring的SPI扩展机制,再把`spring.factories`文件和`EnableAutoConfiguration`提一下,那么这个问题就答的八九不离十了。
    的头像 发表于 03-24 14:27 387次阅读
    <b class='flag-5'>Java</b>中的<b class='flag-5'>SPI</b>动态扩展(下)

    Java、Spring、Dubbo三者SPI机制的原理和区别

    其实我之前写过一篇类似的文章,但是这篇文章主要是剖析dubbo的SPI机制的源码,中间只是简单地介绍了一下Java、Spring的SPI机制,并没有进行深入,所以本篇就来深入聊一聊这三
    的头像 发表于 06-05 15:21 433次阅读
    <b class='flag-5'>Java</b>、Spring、Dubbo三者<b class='flag-5'>SPI</b>机制的原理和区别

    SPI通用接口层介绍

    SPI 通用接口层 SPI 通用接口层把具体的 SPI 设备的协议驱动和 SPI 控制器驱动连接在一起。 负责 SPI 系统与 Linux
    的头像 发表于 07-25 10:52 475次阅读

    什么是SPI机制

    1、前言 在之前的 JVM 分析系列之类加载 提到过 Java SPI 机制,主要是类加载器反双亲委派的实现(第三方包不在指定jdk路径,一般类加载器无法加载,需要特殊
    的头像 发表于 10-08 15:03 564次阅读
    什么是<b class='flag-5'>SPI</b>机制

    SPI接口介绍

    电子发烧友网站提供《SPI接口介绍.pdf》资料免费下载
    发表于 10-13 10:49 0次下载
    <b class='flag-5'>SPI</b>接口<b class='flag-5'>介绍</b>