Java spi机制浅谈

Java SPI概念、实现原理、优缺点、应用场景、使用步骤、实战SPI案例 在当今互联网时代,应用程序越来越复杂,对于我们开发人员来说,如何实现高效的组件化和模块化已经成为了一个重要的问题。而Java SPI(Service Provider Interface)机制,作为一种基于接口的服务发现机制,可以帮助我们更好地解决这个问题。这样会程序具有高度的灵活性、解耦、可扩展性!在本篇博客中,我们将深入探讨Java SPI 的概念、实现原理、优缺点、应用场景和使用步骤,并通过实战演示来说明如何使用 Java SPI 实现各种功能。 阅读详情

最近看到公司的一些框架和之前看到的开源的一些框架的一些服务发现和接入都采用了java的spi机制。

所以简单的总结下java spi机制的思想。

 

我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。

 

 

为了实现在模块装配的时候能不在程序里动态指明,这就需要一种服务发现机制。java spi就是提供这样的一个机制:为某个接口寻找服务实现的机制。有点类似IOC的思想,就是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。

 

java spi的具体约定如下 :

当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 

基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。

jdk提供服务实现查找的一个工具类:java.util.ServiceLoader

 

例子

1.common-logging

apache最早提供的日志的门面接口。只有接口,没有实现。具体方案由各提供商实现,发现日志提供商是通过扫描 META-INF/services/org.apache.commons.logging.LogFactory配置文件,通过读取该文件的内容找到日志提工商实现类。只要我们的日志实现里包含了这个文件,并在文件里制定 LogFactory工厂接口的实现类即可。

2.jdbc

jdbc4.0以前,开发人员还需要基于Class.forName("xxx")的方式来装载驱动,jdbc4也基于spi的机制来发现驱动提供商了,可以通过META-INF/services/java.sql.Driver文件里指定实现类的方式来暴露驱动提供者。

3.自己编写简单例子

假设有一个内容搜索系统,分为展示和搜索两个模块。展示和搜索基于接口编程。搜索的实现可能是基于文件系统的搜索,也可能是基于数据库的搜索。实例代码如下

Search.java: 搜索接口

Java代码   收藏代码
  1. package search;  
  2.   
  3. import java.util.List;  
  4.   
  5. import definition.Doc;  
  6.   
  7. public interface Search {  
  8.     List<Doc> search(String keyword);  
  9. }  

 

FileSearch.java:文件系统的搜索实现

Java代码   收藏代码
  1. package search;  
  2.   
  3. import java.util.List;  
  4.   
  5. import definition.Doc;  
  6.   
  7. public class FileSearch implements Search {  
  8.   
  9.     @Override  
  10.     public List<Doc> search(String keyword) {  
  11.         System.out.println("now use file system search. keyword:" + keyword);  
  12.         return null;  
  13.     }  
  14.   
  15. }  

 

DatabaseSearch.java

Java代码   收藏代码
  1. package search;  
  2.   
  3. import java.util.List;  
  4.   
  5. import definition.Doc;  
  6.   
  7. public class DatabaseSearch implements Search {  
  8.   
  9.     @Override  
  10.     public List<Doc> search(String keyword) {  
  11.         System.out.println("now use database search. keyword:" + keyword);  
  12.         return null;  
  13.     }  
  14.   
  15. }  

 

SearchTest.java

Java代码   收藏代码
  1. package search;  
  2.   
  3. import java.util.Iterator;  
  4. import java.util.ServiceLoader;  
  5.   
  6. public class SearchTest {  
  7.   
  8.     public static void main(String[] args) {  
  9.         ServiceLoader<Search> s = ServiceLoader.load(Search.class);  
  10.         Iterator<Search> searchs = s.iterator();  
  11.         if (searchs.hasNext()) {  
  12.             Search curSearch = searchs.next();  
  13.             curSearch.search("test");  
  14.         }  
  15.     }  
  16. }  

 

最后创建在META-INF/searvices/search.Search文件。

当search.Search文件内容是"search.FileSearch"时,程序输出是:

now use file system search. keyword:test

当search.Search文件内容是"search.DatabaseSearch"时,程序输出是:

now use database search. keyword:test 
可以看出SearchTest里没有任何和具体实现有关的代码,而是基于spi的机制去查找服务的实现。

 

参考文献:

http://docs.oracle.com/javase/1.4.2/docs/guide/jar/jar.html#Service%20Provider

 

(全文完)

光谱分布、光谱辐射通量密度与不同时间段分布光谱(图示) 1、光谱分布图 2 太阳辐射能量图 3、不同时间段的太阳分布光谱图 4、不同波长的光的能量分布主要区域 5、不同波段的使用场景 阅读详情

相关推荐

浮点数精度陷阱全解析:从IEEE 754到深度学习部署选型

在计算机数值计算中,浮点数是表示带小数数字的标准方式,但它的存储规则决定了精度和边界天生存在限制。许多开发者都曾遭遇过0.1+0.2不等于0.3的尴尬,或是模型训练中loss变成NaN的困扰,这些问题的根源往往指向IEEE 754标准中的规格化、非规格化表示及舍入规则。理解浮点数的底层原理,不仅能避开直接的比较判断陷阱,还能指导我们在不同场景下做出合理的技术选型。从C语言的printf到Python的repr,从嵌入式串口打印到深度学习中的FP32、FP16、BF16、TF32格式,浮点数知识贯穿底层开发和

weixin_34314962的博客 463

图文并茂带你理解Java的SPI机制

项目结构:pom文件。

落日的博客 1万+

MATLAB2021b详细安装教程

1.下载 2.安装 下载安装包后打开iso文件,若是无法打开请用解压软件打开。 ①打开MATLAB_R2021b_win64,双击软件开始安装 ② 一直点击下一步,直到步骤③ ③选择我已有我的许可证的文件密钥,并输入62551-02011-26857-57509-64399-54230-13279-37181-62117-65158-40352-64197-45508-24369-45954-39446-39538-16936-10698-58393-44718-32560-10501-40

惜洛-Jankin的博客 9万+

JavaSPI详解

SPI全名,翻译过来就是“服务提供接口”,再说简单就是提供某一个服务的接口, 提供给服务开发者或者服务生产商来进行实现。Java SPI是JDK内置的一种动态加载扩展点的实现。这个机制在一般的业务代码中很少用到(个人接触到的业务没有用到过),但是再底层框架中却被大量使用,包括JDBC、Dubbo、Spring框架、日志接口中都有用到,不同的是有的使用Java原生的实现,有的框架则自己实现了一套SPI机制。

Q54665642ljf的博客 1万+

【扫地机器人测试】

本测试方案旨在系统性评估扫地机器人的核心功能、性能指标、可靠性及用户体验,验证产品是否符合设计规范、行业标准及市场需求。通过多维度、全场景的测试,精准定位产品缺陷与优化空间,为产品迭代提供数据支撑,确保上市产品的质量稳定性与用户满意度。

xuhuaiyaun的博客 1371

【UG/NX二次开发】记录在二次开发中遇到的坑

【UG/NX二次开发】记录在二次开发中遇到的坑

Trust_MJ的博客 2707

Java SPI 机制详解

Java的SPI(Service Provider Interface)机制是一种服务发现机制,它允许第三方为一个接口或抽象类提供实现,并使得应用程序可以在运行时发现和使用这些实现。SPI机制的核心思想是将接口实现类的全类名配置在一个文本文件中,应用程序通过读取这个文件来获取接口实现类的全类名,然后使用反射机制创建实例并调用方法。演示代码Github。

weixin_42093668的博客 4176

电源完整性之仿真设计原理

电源完整性(Power Integrity),简称为PI,也就是大家平常听说的PI。PCB板上的电源设计也是非常重要的,不当的设计也会引起很重要的影响。所以电源完整性PI和信号完整性SI,是我们互连设计人员应该同等重视的问题。今天整理本人接触的电源完整性PI的一些原理,从不的角度去看PI,会有不同的理解,下面开始喽!!! 提到互连的电源设计,可能首先想到的电源分配网络(Power Distribution Nets),因为互连电源会有许多种,直流DC和交流AC,还有不同的电压调节模块(VRM)与不同的负载端

刘小同学的博客 7373

Java SPI机制

SPI的全称是Service Provider Interface,中文名为服务提供者接口,是一种服务发现机制,基于JDK内置的动态加载实现扩展点的机制。

csdn_fanhehua的博客 3173

告别电源纹波!手把手教你用UCC28019设计一个高效率PFC模块(附完整原理图与BOM清单)

本文详细介绍了如何使用UCC28019设计高效率PFC模块,解决电源纹波问题。通过优化补偿网络、关键元器件选型及PCB布局,实现功率因数提升至0.99以上,降低输入电流谐波。附完整原理图与BOM清单,适用于电赛等快速开发场景。

weixin_42652674的博客 335

2026 企查查/天眼查:IP频率限制 + 验证码策略,企业工商数据采集实战

企业工商数据采集技术解析与解决方案 本文深度剖析了2026年企查查和天眼查平台的反爬机制与技术对抗方案。主要内容包括: 反爬机制分析: 采用JA4+ TLS指纹识别、极验v6验证码等多层防护 IP限制策略严格区分未登录/普通/VIP账号 精准识别并封禁数据中心IP 核心解决方案: 构建高可用住宅代理池,动态轮换真实用户IP 基于YOLOv8的验证码缺口识别技术(准确率99%) 分布式架构设计,支持千万级数据采集 多账号池管理与行为模拟技术 技术亮点: 动态住宅IP池实现1%以下封禁率 Playwright浏

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1326

浅谈java SPI机制

SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是 解耦。

程序员乌拉的博客! 346

Orin 调试GMSL camera 96712手册重点

96712基础理解

乐于分享 9188

java spi 好处_浅谈 Java SPI 机制

开篇本文主要谈一下 Java SPI(Service Provider Interface) ,因为最近在看 Dubbo 的相关内容,其中涉及到了 一个概念- Dubbo SPI, 最后又牵扯出来了 JAVA SPI, 所以先从 Java SPI 开整。正文平常学习一个知识点,我们的常规做法是:是什么有什么用怎么用这次我们倒着做,先不谈什么是 SPI 及其作用,来看下如何使用。使用1. 创建一个 ...

weixin_32946543的博客 1127

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

浅谈Java SPI机制及JDBC的SPI解析

SPI全称Service Provider Interface,是Java提供的一套供第三方实现或扩展使用的技术体系。主要通过解耦服务具体实现以及服务使用,使得程序的可扩展性大大增强,甚至无耦合(例如:需要的时候导入依赖,不需要的时候删除依赖即可,不需要其他操作)。 SPI基本原理 为什么需要SPI 思考一个场景,我们封装了一套接口以及对应默认实现,别人通过引入我们写好的包就可以使用这些接口以及默认实现来完成相应的操作,这本来没有什么问题,但是当使用者因为某些业务需求,需要进一

sun8482428的博客 509

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

浅谈JAVA中的SPI机制

SPI,全称Service Provider Interface, 是Java中提供的一种服务发现机制,它允许应用程序动态地加载和使用第三方提供的服务实现,而无需在代码中显示引用这些实现类。通过将服务接口和其实现分离,从而具备更加好的可扩展性和可维护性。Java SPI就是提供这样的一个机制:为某个接口寻找服务实现的机制,将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要。所以SPI的核心思想就是解耦。

qq_60536984的博客 611

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

zz【java规范】Java spi机制浅谈

http://www.ivanzhangwb.com/archives/274 最近看了点关于java 的spi机制,值得参考的几篇文章如下: http://developer.51cto.com/art/201111/305150.htm http://singleant.iteye.com/blog/1497259 http://docs.oracle.com/javase/...

118

java的SPI扩展机制_浅谈Java领域中的SPI扩展机制

在Java领域,有一种重要的服务扩展机制,即SPI,它在编写框架和项目应用中起着重要的作用。SPI的英文全称为service provider interface,即服务提供接口,在JDK、Spring和Dubbo中都有它的存在。我个人认为,SPI存在最根本的目的是实现模块或组件的可插拔性,核心思想那便是解耦了。一、JDK在JDK的java.util包下有一个非常显眼的类,即ServiceLoad...

weixin_34975747的博客 377

浅谈 Java 中的 SPI 机制

面向接口编程 面向接口编程就是先把客户的业务逻辑先提取出来,作为接口,业务具体实现通过该接口的实现类来完成。 当客户需求变化时,只需编写该业务逻辑的新的实现类,不需要改写现有代码,减少对系统的影响。 其遵循的思想是:对扩展开放,对修改关闭。在使用面向接口的编程过程中,将具体逻辑与实现分开,减少了各个类之间的相互依赖。 面向接口编程的优点: 降低程序的耦合性 易于程序的扩展 有利于程序的...

晚晴小筑 1377

浅谈Java领域中的SPI扩展机制

在Java领域,有一种重要的服务扩展机制,即SPI,它在编写框架和项目应用中起着重要的作用。SPI的英文全称为service provider interface,即服务提供接口,在JDK、Spring和Dubbo中是不可或缺的。 一、JDK 在JDK的java.util包下有一个非常显眼的类,即ServiceLoader。不妨打开该类的源码,看到注释的第一行是A simple service...

Java技术分享 826

【java规范】Java spi机制浅谈

SPI的全名为Service Provider Interface.普通开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。究其思想,其实是和"Callback"差不多。“Callback”的思想是在我们调用API的时候,我们可以自己写一段逻辑代码,传入到API里面,API内部在合适的时候会调用它,从而实现某种程度的“定制”。

Xiao_Qiang_的专栏 968
上一篇: Java多线程-新特征-信号量Semaphore
下一篇: Dubbo/Dubbox的服务暴露(一)
weiythi
博客等级 码龄16年 23粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值