java原生SPI机制详解

Java SPI 机制详解 文件夹下的 services 文件夹下的文件,将这个文件夹下面的所有文件先加载到内存中,然后根据这些文件的文件名和里面的文件内容找到相应接口的具体实现类,找到实现类后就可以通过反射去生成对应的对象,保存在一个 list 列表里面,所以可以通过迭代或者遍历的方式拿到对应的实例对象,生成不同的实现。所以会提出一些规范要求:文件名一定要是接口的全类名,然后里面的内容一定要是实现类的全类名,实现类可以有多个,直接换行就好了,多个实现类的时候,会一个一个的迭代加载。修改或者替换服务实现并不需要修改调用方。 阅读详情

什么是SPI    

    软件很大程度是真实世界的反映,思想、模式都能在真实事物找到影子。这不难理解,因为不管是真实事物还是软件都是由人类创造,都是朝着高效、低成本方向发展,难免相互借鉴。SPI也是如此,SPI全称Service Provider Interface。本质就是上层软件制定所需模块的接口规范,然后基于这个规范搭建上层建筑,至于模块谁来开发实现并不关心,反正厂商按照接口规范做出来就好。好比汽车厂商开发一款新型汽车,轮胎不要他生产,他只要告诉轮胎厂商这款车要用195/55/R16 85V 规格的轮胎,轮胎厂商按照这个标准生产即可。

    SPI的应用比较常见,比如说 (1) jdbc驱动,如果针对具体的数据库开发软件,换数据库将是灾难级调整。所以业务面向jdbc接口规范开发,利用SPI自动发现接口实现类将极大提高软件的扩展性;(2) 之前写过的ServletContainerInitializer,servlet容器用SPI发现spring-web包中的SpringServletContainerInitializer从而启动初始化应用;(3) 此外,还有日志框架、validation(hibernator-validator)也是基于SPI机制发现具体的服务实现。

SPI机制原理

    SPI的核心是java.util.ServiceLoader。ServiceLoader大致的过程是在classpath*:META-INF/services/目录下查找配置文件(名称是接口的全路径类名),这个文件里面每一行就是实现类的全路径类名,然后用当前线程的classloader加载实现类。具体实现可以看看jdk源码:

public final class ServiceLoader<S> implements Iterable<S>{
    //查找的目录
    private static final String PREFIX = "META-INF/services/";
    ......

    //内部类 具体的查找的实现
    private class LazyIterator implements Iterator<S>{
        ......
        private boolean hasNextService() {
            if (nextName != null) {
                return true;
            }
            if (configs == null) {
                try {
                    String fullName = PREFIX + service.getName();
                    if (loader == null)
                        configs = ClassLoader.getSystemResources(fullName);
                    else
                        configs = loader.getResources(fullName);
                } catch (IOException x) {
                    fail(service, "Error locating configuration files", x);
                }
            }
            while ((pending == null) || !pending.hasNext()) {
                if (!configs.hasMoreElements()) {
                    return false;
                }
                pending = parse(service, configs.nextElement());
            }
            nextName = pending.next();
            return true;
        }
        ......
    }
    ......
}

spi demo程序

    整一个demo程序跑一跑,否则太干巴巴的了,demo程序尽量简单,只是打个日志,实现2个具体的实现类。

    首先,定一个接口LogPrint

public interface LogPrint {
    //打印日志
    void  print(String message);
}

   其次,创建2个实现类LogPrintImplA、LogPrintImplB

package com.focuse.jdkdemo.spi;

public class LogPrintImplA implements LogPrint {
    @Override
    public void print(String message) {
        System.out.println("LogPrinterA: " + message);
    }
}
package com.focuse.jdkdemo.spi;

public class LogPrintImplB implements LogPrint {
    @Override
    public void print(String message) {
        System.out.println("LogPrinterB: " + message);
    }
}

第三步,在目录META-INF/services下创建文件com.focuse.jdkdemo.spi.LogPrint,文件内容2行。

最后,用ServiceLoader加载实现类,并运行程序

package com.focuse.jdkdemo.spi;

import java.util.Iterator;
import java.util.ServiceLoader;

/**
 * @author :focuse
 * @date :Created in 2020/2/16 上午11:10
 * @description:
 * @modified By:
 */
public class SPIDemo {

    public static void main(String[] args) {
        ServiceLoader<LogPrint> loader = ServiceLoader.load(LogPrint.class);
        Iterator<LogPrint> it = loader.iterator();
        while (it.hasNext()) {
            it.next().print("hello spi!");
        }
    }
}

ps: 为了让demo程序简单,就没有用jar引用的形式,而是直接在一个工程里面完成所有的事情

从爱好者到工程师:如何低成本体验RFSoC ZU47DR?性能实测与避坑指南 本文详细介绍了如何低成本体验赛灵思RFSoC ZU47DR芯片,包括二手开发板选购、租赁服务、精简开发环境搭建等实用方案。通过性能实测与避坑指南,帮助爱好者和工程师在有限预算下充分利用这款集成了ARM处理器和FPGA的高性能芯片,降低开发门槛。 阅读详情

相关推荐

LSF调度实战:如何用bsub命令实现多队列资源抢占与公平调度

本文深入探讨了LSF作业调度系统的高级实战技巧,重点解析如何通过配置`lsb.queues`文件与灵活运用`bsub -R`命令,构建一套兼顾效率与公平的多队列资源抢占与调度体系。文章详细介绍了队列优先级设计、公平共享机制、资源感知调度以及抢占策略的实施,帮助集群管理员解决高优先级任务等待、资源分配不均等常见问题,实现计算资源的精细化管理和高效利用。

vvv99的博客 218

Java SPI机制详解

SPI全称Service Provider Interface,是Java提供的一种服务发现机制。实现服务接口和服务实现的解耦。 Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制,实现不修改任何代码的情况下切换不同的实现。

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 3273

SAP 财务BAPI_ACC_DOCUMENT_POST批导的税务tax

最近遇到了关于SAP财务凭证批导要bapi:BAPI_ACC_DOCUMENT_POST增加税的功能要求,查阅了一众文献发现都不尽如人意,所以想着自己写一个趟过的雷吧。 一般前台sap的凭证是有自动计算税码的勾选框的,但是bapi却并没有这个字段。 实际操作过程中1.可以定义一个税额的结构,参考bapiactx09 2.在会计分录上传如果需要增加税码的时候,譬如总账gl,需要对应tax_code 3.通过CALCULATE_TAX_FROM_GROSSAMOUNT 计算出税额和acct_k...

qq_35640448的博客 3187

一篇文章搞明白Java中的SPI机制

SPI机制是Java的一种服务发现机制,为了方便应用扩展。那什么是服务发现机制?简单来说,就是你定义了一个接口,但是不提供实现,接口实现由其他系统应用实现。你只需要提供一种可以找到其他系统提供的接口实现类的能力或者说机制。这就是SPI机制( Service Provider Interface)eclipse和idea里的插件使用就是通过SPI机制实现的。开发工具提供一个扩展接口,具体的实现由插件开发者实现,开发工具提供一种服务发现机制来找到具体插件的实现,这就达到了插件的安装效果。从而可以使用插件服务。

qq_42394044的博客 6115

FIFO应用于UART串口(含代码)

FIFO(First in first out)即先入先出,可以把它理解成一个缓存器,对于收发两端速度不一致,位宽不一致的情况可以使用FIFO作为收发两端中间的“调节剂”使数据可以进行正常发送。

m0_58544042的博客 2752

Python进行.tif格式数据波段组合;多波段tif数据波段分离

Python进行.tif格式数据波段组合;多波段tif数据波段分离.tif格式数据波段组合多波段.tif数据波段分离 阔别已久,我又来了;啊啊啊…… 读了研究生,忙到天昏地暗(哈哈哈,这都是借口,主要是花了一定时间适应研究生生活) 这方面的内容我也主要是应用在遥感领域,我们知道在遥感应用中,大多数的图像数据格式为.tif格式的。进行波段组合使用ArcGIS里面的Composite Bands工具是可以实现的,波段分离也可以使用一些工具或巧妙的方法分开。但当你使用Python程序的话,就可以简化这个软件点击和

qq_44353170的博客 1万+

Java——SPI机制详解

SPI 全称是 Service Provider Interface,是一种 JDK 内置的动态加载实现扩展点的机制,通过 SPI 技术我们可以动态获取接口的实现类,不用自己来创建。这个不是什么特别的技术,只是 一种设计理念。在面向对象的设计原则中,一般推荐模块之间基于接口编程,通常情况下调用方模块是不会感知到被调用方模块的内部具体实现。一旦代码里面涉及具体实现类,就违反了开闭原则。如果需要替换一种实现,就需要修改代码。为了实现在模块装配的时候不用在程序里面动态指明,这就需要一种服务发现机制。

吴声子夜歌的博客 3490

铁路场景雷达点云目标识别与追踪系统

本文介绍了一种基于毫米波雷达的铁路货运车站安全监控系统。该系统采用分布式架构,通过多个毫米波雷达节点采集点云数据,经过坐标转换、多雷达融合等处理后,利用机器学习算法实现列车、行人等目标的实时识别与追踪。系统包含数据采集层、处理层、目标识别层、追踪层、预警决策层和可视化层,能够克服传统视频监控受环境影响大的缺点,实现全天候可靠监测。文中详细展示了雷达数据解析和点云预处理的代码实现,包括坐标转换、数据格式解析和体素网格滤波等关键技术。该系统可有效预警铁路场景下的碰撞风险,提升货运车站的安全管理水平。

huanghm88的专栏 125

Java SPI机制

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

csdn_fanhehua的博客 3173

110、3A 端到端调试:从 ISP register dump 到主观画质的完整调试流程

文章摘要 本文分享了ISP 3A(AE/AWB/AF)端到端调试的实战经验,通过具体案例解析常见问题排查方法。从硬件链路确认、寄存器dump分析、算法闭环验证到主观画质调优,提出了一套系统化调试流程。重点包括:如何通过示波器和寄存器抓包定位时序问题,AWB调试中black level校正的关键作用,AF闭环控制中hall传感器反馈的重要性,以及算法与硬件联调的"三板斧"方法论。作者强调3A调试本质是系统工程,需结合物理层信号测量、数据通路验证和算法状态跟踪,避免陷入局部优化陷阱。

sundong_81的博客 58

【论文汇总】Diffusion Models视频生成/视频编辑/可控视频生成/跨模态视频生成

本文总结了Diffusion Models视频生成领域相关的工作,目前共收录142篇,持续更新中。

沉迷单车的追风少年 1672

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

项目结构:pom文件。

落日的博客 1万+

社会网络仿真软件:NetLogo_(14).社会网络数据导入与导出

在NetLogo中,社会网络的仿真不仅依赖于模型的内部逻辑,还需要能够灵活地导入和导出数据。这使得用户可以利用外部数据来初始化模型,或者将模型的运行结果导出以便进一步分析。本节将详细介绍如何在NetLogo中实现社会网络数据的导入和导出,包括常见的数据格式和具体的代码示例。

kkchenjj的博客 600

Java深入解析篇三十之SPI机制详解

/ 实现SLF4JServiceProvider接口@Override@Override@Override@Override# Dubbo SPI配置文件路径(与Java SPI不同)META-INF/dubbo/{接口全限定名}META-INF/dubbo/internal/{接口全限定名}META-INF/dubbo/compat/{接口全限定名}缺陷说明影响全部加载不能按需加载指定实现性能浪费,启动慢无名称索引无法按名称获取特定实现使用不便无IOC。

萧瑟余晖的博客 502

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java中的SPI机制是什么

它是启动时的“配置文件驱动的工厂”。不要指望它承受插件系统的所有重量。最容易被忽视的是,它不处理类别之间的依赖关系,无论你的初始化顺序如何——这些都必须自己完成。SPI 它本身并不能解决这个问题,它只是一个发现工具,类加载责任仍然掌握在你手中。它没有条件组装,没有优先级,不支持参数注入,也没有缓存实例-每次。只分析配置文件和验证类名是否存在,不触发类加载。ClassLoader 冲突。,文件内容是一行一行实现类的全名(如。),但是,如果版本不同,很容易出现。懒惰的加载机制:它只在。都 new 新对象。

qq360737395的博客 95

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java SPI 机制实战:用 ServiceLoader 写出可插拔的扩展点

你有没有遇到过这种需求:核心代码里有一个「支付渠道」「文件解析器」「短信通道」之类的接口,现在要接第三个、第四个实现,结果每加一个就得回去改一次工厂类的switch,还得重新编译打包核心模块。业务方想自己塞一个实现进来?对不起,请给核心模块提 PR。这就是典型的「扩展点写死在核心里」。JDK 自带的 SPI(Service Provider Interface)+就是来解决这个的:核心只定义接口,实现方把自己的实现「声明」在一个约定文件里,运行时自动被发现、加载。JDBC 的Driver。

weixin_42662753的博客 178

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Dubbo中的SPI机制

即 SPI,是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件。可以让不同的厂商针对统一接口编写不同的实现SPI实际上是“接口+策略模式+配置文件”实现的动态加载机制。在系统设计中,模块之间通常基于接口编程,不直接显示指定实现类。一旦代码里指定了实现类,就无法在不修改代码的情况下替换为另一种实现。为了达到动态可插拔的效果,java提供了SPI以实现服务发现。SPI机制的应用场景有很多,我们比较常用的就是JDBC,Dubbo等在谈Dubbo的SPI机制前我们需要先了解一下Java原生的SPI机

Admans的专栏 2781

JAVA SPI机制深入详解

1.什么是SPI SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。SPI的作用就是为这些被扩展的API寻找服务实现。 2.SPI和API的使用场景 API (Application Programming Interface)在大多数情况下,都是实现方制定接口并完成对接口的实现,调用方仅仅依赖接口调用,且无权选择不同实现。从使用人员上来说,API 直接被应用开发人员使用。 ...

wangxuelei036的博客 1万+

Java常用机制 - SPI机制详解

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

珍惜当下 3503

Java SPI机制详解20241005

这里先大概解释一下:Java中的SPI机制就是在每次加载类的时候会先去找到class相对目录下的META-INF文件夹下的services文件夹下的文件,将这个文件夹下面的所有文件先加载到内存中,然后根据这些文件的文件名和里面的文件内容找到相应接口的具体实现类,找到实现类后就可以通过反射去生成对应的对象,保存在一个list列表里面,所以可以通过迭代或者遍历的方式拿到对应的实例对象,生成不同的实现。中,c1就是线程上下文类加载器(Thread Context ClassLoader)。

zhuangjiaxing的博客 1832

聊聊JAVA的SPI机制

介绍了JDK SPI的原理以及实战案例,Spring SPI非自动注入和自动注入的区别与原理

github_33882640的博客 2115

详解 SPI 机制

新建一个 maven 项目// 获取型号// 开关// 调节温度// 模式变更用 maven 把它打成 jar 包,供后续的服务实现使用(服务提供者在项目中就可以引入这个 jar 包)有了这套规范,就保证了产品后期不管怎么更新换代,都能接入到系统来Spring SPI 配置文件是一个固定的文件 -//获取所有factories文件中配置的LoggingSystemFactorySpring 也是支持 ClassPath 中存在多个。

sco5282的博客 2881

Java中SPI机制详解

https://www.jianshu.com/p/46b42f7f593c 本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践、学习开源项目提供参考。 1 SPI是什么 SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。 整体机制图如下: Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。 系统设计的

yygr的博客 3915

Java的SPI机制详解

SPI(Service Provicer Interface)是Java语言提供的一种接口发现机制,用来实现接口和接口实现的解耦。简单来说,就是系统只需要定义接口规范以及可以发现接口实现的机制,而不需要实现接口。SPI机制在Java中应用广泛。例如:JDBC中的数据库连接驱动使用SPI机制,只定义了数据库连接接口的规范,而具体实现由各大数据库厂商实现,不同数据库的实现不同,我们常用的mysql的驱动也实现了其接口规范,通过这种方式,JDBC数据库连接可以适配不同的数据库。

qq_35485206的博客 1019
上一篇: 并发-CountedCompleter详解
下一篇: @Repeatable详解-getAnnotation、getDeclaredAnnotation获取不到对象
北堂桓禧
博客等级 码龄10年 23粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值