Java SPI机制原理和使用场景

阿里一面:说一说Java、Spring、Dubbo三者SPI机制的原理和区别 SPI全称为Service Provider Interface,是一种动态替换发现的机制,一种解耦非常优秀的思想,SPI可以很灵活的让接口和实现分离,让api提供者只提供接口,第三方来实现,然后可以使用配置文件的方式来实现替换或者扩展,在框架中比较常见,提高框架的可扩展性。简单来说SPI是一种非常优秀的设计思想,它的核心就是解耦、方便扩展。通过以上分析可以看出,实现SPI机制的核心原理就是通过IO流读取指定文件的内容,然后解析,最后加入一些自己的特性。 阅读详情

SPI的全名为Service Provider Interface.这个是针对厂商或者插件的。一般来说对于未知的实现或者对扩展开放的系统,通常会把一些东西抽象出来,抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。这个可以通过我们的抽象工厂方法来理解这个含义,实现是可以又厂商或者开发人员自己实现。由于代码上是处于上层的一个封装者,是不会知道底层怎么去实现,那么只能通过spi的形式,让上层知道应该调用哪个抽象的具体实现。所以这里可以理解为某些jar包里,为其他开发扩展调用使用的一种方式,可以为某个接口或服务,提供一个具体的实现。

主要用到ServiceLoader这个类,ServiceLoader通过读取resources/META-INF/services/com.xxx.xxx.xxxService文件下的xxxService的spi实现类,通过反射获取对应类实例,并调用对应方法。

public class SearchFactory {
    private SearchFactory() {
    }

    public static Search newSearch() {
        Search search = null;
        ServiceLoader<Search> serviceLoader = ServiceLoader.load(Search.class);//查找spi的实现
        Iterator<Search> searchs = serviceLoader.iterator();
        if (searchs.hasNext()) {
            search = searchs.next();
        }
        if (search == null) {//如果没有spi实现,就是用默认的类对象实现
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            try {
                search = (Search) classLoader.loadClass(Search.defaultSearchClass).newInstance();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return search;
    }
}

使用场景有:

1、javax.xml.ws.spi.Provider,这个类可以使用另外的实现,如com.sun.xml.internal.ws.spi.ProviderImpl。

这里需要在工程下的resources目录,建一个META-INF/services目录,然后创建一个文件名为javax.xml.ws.spi.Provider,文件内容为com.sun.xml.internal.ws.spi.ProviderImpl。如果对于spi没有默认实现的,那么将会报错,这里就需要按照以上格式进行添加。


关于spi的更多了解,大家可以查看我写的一个简单的代码,非常简单。多谢大家支持!

github代码:https://github.com/zhuzhenke/java-spi-test



什么是 Java 的 SPI(Service Provider Interface)机制? 问题解答1. SPI 的概念SPI(Service Provider Interface)是 Java 提供的一种服务发现机制。它允许框架或应用程序通过定义一套接口,并让第三方开发者提供具体实现,从而实现模块化设计和动态扩展功能。服务接口与服务实现分离,服务消费者通过接口调用服务,而具体实现则通过配置文件动态加载。2. SPI 的工作原理定义服务接口创建一个接口,定义服务的标准行为。服务提供者实现接口第三方开发者根据接口编写具体实现类。通过配置文件声明服务实现在目录下,创建一个以接口全限定名。 阅读详情

相关推荐

机场数据治理系列介绍(1):机场行业数据中台中的数据管理顶层设计方案

民航机场行业的数据中台中,有关数据管理顶层设计方案需要结合机场行业的业务特点和技术需求进行具体的设计,今日我们简要考量设计提供一个参考方案:

机场信息系统研究员的专栏 1604

java的spi机制使用场景讲解和具体使用

java的spi机制使用场景讲解和具体使用

weixin_59244784的博客 1307

IntelliJ IDEA 2025.1 + Gradle 镜像配置避坑指南:解决依赖下载慢的终极方案

本文针对IntelliJ IDEA 2025.1开发环境中Gradle依赖下载缓慢的问题,提供了详细的镜像配置避坑指南。通过解析Gradle依赖解析机制,重点指导如何正确配置阿里云等国内镜像仓库,并分享验证配置生效、排查常见错误及高级优化技巧,旨在彻底解决依赖下载难题,提升开发效率。

weixin_28835551的博客 531

【Java基础】Java SPI 一 之SPI(Service Provider Interface)进阶& AutoService

SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制(为某个接口寻找服务实现的机制),可以用来启用框架扩展和替换组件,其核心思想就是解耦。模块之间基于接口编程,模块之间不对实现类进行硬编码,当代码里涉及具体的实现类,就违反了可拔插的原则,为了实现在模块装配的时候能不在程序里动态指明,就需要spi了。这里我们要跟API区分开来,简单介绍一下API。

fumeidonga的博客 2057

2021秋招IC验证面经-ARM中国/中科芯/飞腾/地平线/中兴

中科芯 (央企福利待遇好,但是百分百不解决户口,适合当地人进去躺平。) 现场面试,三个面试官,时间大约40min 首先介绍一下自己,介绍一下项目。所做项目用到了FIFO吗,深度是多少,位宽是多少,仲裁算法是什么? 验证环境中的reference model是自己写的还是本身就有的,仲裁怎么在参考模型中实现,参考模型怎么获取寄存器的值? 怎么配置RTL寄存器,通过平台的寄存器模型进行寄存器配置,寄存器模型里边的方法,写一个寄存器或读一个寄存器怎么实现? 寄存器如何实现前门访问和后门访问,后门访问时

weixin_48014653的博客 6317

华为2021年天线工程师笔试题目回忆总结(持续更新)

1. 判定长线和短线 所谓长线是指传输线的几何长度和线上传输电磁波的波长的比值(即电长度)大于或接近于1。反之称为短线。是相对于波长而言的。 1000m的传输线,对于频率为50hz(即波长为6000km)的交流电来说,仍远小于波长,应视为短线。长线和短线的区别还在于:长线为分布参数电路,而短线是集总参数电路。 2. 判定传输线的容性和感性 传输线上的输入阻抗具有以下特点: 1/4波长变换性:感性负载与容性负载变换,开路与短路变换; 1/2波长重复性:相距1/2波长的整数倍的两个点输入阻抗都相等。1/4开路传

ludashi3的博客 9530

SPI机制的应用及简单示例

通过上述简单示例,可以看到 SPI 机制在 Java 中如何定义服务、实现服务以及动态加载实现。它提供了一种灵活的方式来扩展系统,有效地支持模块化和插件架构。如果你有其他问题或需要更深入的解释,请随时问我!

java永无止境! 736

DeepSeek-OCR安装部署文档和避坑指南,包含大多数人遇到的安装报错问题

DeepSeek-OCR安装部署指南摘要:本文详细介绍高性能OCR工具DeepSeek-OCR的安装流程,支持多语言识别和复杂场景文字提取。系统要求包括Linux/Windows/macOS操作系统,推荐NVIDIA显卡(显存≥6GB)和≥16GB内存。安装步骤涵盖:1)创建conda虚拟环境;2)安装PyTorch等核心依赖;3)解决常见问题如CUDA版本冲突、模型下载慢等。提供GPU内存不足等问题的解决方案,帮助开发者快速部署OCR服务。(149字)

yolo模型训练找我,AI游戏合作找我 2939

SPI机制:Java SPI原理及源码剖析、应用场景分析与自实现案例实战详解

先定义云计算标准SPI接口,并发布到本地仓库供华为云和阿里云实现:①项目总览:/*** 标准SPI接口/*** 计算方法/*** 加载具体的服务实现*//*** 加载服务(这里简单的直接使用JDK原生的ServiceLoader类)* */if (!// 取第一个} else {/*** CloudComputeService 双重检验锁单例加载* */System.out.println("CloudCompute服务未加载!");

weixin_51360020的博客 1622

基于数字图像处理方法的迷宫问题图解 : 基于骨架提取、四邻域

问题是,这条红色的线是人为标记出来的能通的路线,对计算机来看,黑色和红色的线没有任何差异,所以之前的想法压根不起作用。对应于数字图像的表达,就是从远离主干的分支端点出发,如果4邻域中只有一个可以通的道路,那么这个点在分支上。闪电划过,有一道连接了天空和大地,就是迷宫的解,其余的分支就是迷宫中对应的死路。类似这个闪电图,假设图中最粗的主干(迷宫解的路线)是最先形成的,其余的细小的分支是慢慢从主干上形成的。因此,只要在端点的4邻域中,找到可以走的道路,那么一定就是分支,也就是要移除的路线。

Henry的博客 2073

AI 学术科研与论文写作的正确打开方式!不套提示词模板,靠这个思路完美实现人机共创

真正的“人机共创”,也就是AI引导我思考的过程,如果你想用你的模糊需求,去写出专业化的学术内容,那是不可能的。对想快速完成某些学术任务的同仁来说,我们完全不用去抠提示词的细节,直接用魔法打败魔法,设计一段优化提示词的结构化提示词(提示词架构),辅助优化你的模糊需求。创建好之后,可以对它提你的任何模糊学术需求,比如写论文、写综述、学术润色等等,它绝不会直接帮你生成,而是先搞懂你的真实意图。以上整个流程,完全没有一句废话,先是思考,再是向你提问弄懂你的意图,最后整合你给出的关键信息,直接优化你给的模糊需求。

智能AI让学术科研更容易 477

Java SPI详解

Java SPI详解1. SPI概述1.1 什么是SPI1.2 适用场景2. SPI原理3.SPI案例3.1 项目需求3.2 项目结构3.3 项目地址 1. SPI概述 1.1 什么是SPI SPI全称Service Provider Interface,是一种服务发现机制。为了被第三方实现或扩展的 API,它可以用于实现框架扩展或组件替换。 SPI 机制本质是将 接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载文件中的实现类,这样运行时可以动态的为接口替换实现类。 SPI本质上就是动态指

靖节先生的博客 791

第五天 Labview数据记录(5.4 EXCEL文件读写)

Excel 文件读写在数据处理、自动化办公、数据分析等领域具有重要的意义。以下是 Excel 文件读写的主要应用场景和意义:1. 数据管理和整理;2. 自动化办公;3. 数据分析和可视化;4. 系统集成;5. 报表生成;6. 教育和培训;7. 实际应用场景。Excel 文件读写的意义在于提高数据处理的效率、减少人工操作、支持自动化办公、促进数据分析和可视化,以及实现系统之间的数据交互。无论是企业、组织还是个人,都可以通过 Excel 文件读写实现数据的高效管理和利用。

weixin_38637405的博客 1261

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

SPI机制

今天又是充满希望的一天 612

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

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【Java杂记】SPI机制:使用示例及原理浅析

1.SPI是什么 SPI全称Service Provider Interface,是 JDK 内置的一种服务提供发现机制,目前市面上有很多框架都是用它来做服务的扩展发现。简单来说,它是一种动态替换发现的机制。它可以用来启用框架扩展和替换组件。整体机制图如下: Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。 接口:调用方需要的服务 策略模式:多个提供方,会提供自己的接口实现 配置文件:提供方告知调用方,具体实现类在哪里,然后调用方去加载;本质上是一种通信方式 =

A minor 2033

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

某大厂面试题:说一说Java、Spring、Dubbo三者SPI机制的原理和区别

SPI全称为Service Provider Interface,是一种动态替换发现的机制,一种解耦非常优秀的思想,SPI可以很灵活的让接口和实现分离,让api提供者只提供接口,第三方来实现,然后可以使用配置文件的方式来实现替换或者扩展,在框架中比较常见,提高框架的可扩展性。简单来说SPI是一种非常优秀的设计思想,它的核心就是解耦、方便扩展。通过以上分析可以看出,实现SPI机制的核心原理就是通过IO流读取指定文件的内容,然后解析,最后加入一些自己的特性。

20年码农 379

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SPI机制

javaSPI机制 一、什么是SPI SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。整体机制图如下: Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机制。 系统设计的各个抽象,往往有很多不同的实现方案,在面向的对象的设...

laomumu1992的博客 304

Java SPI 机制原理分析

JDK SPI 机制原理分析 最近开始看 Dubbo 源码, 而 Dubbo 的一大优秀设计就是 Dubbo SPI 机制, 而 Dubbo 的 SPI 是对 JDK 的 SPI 的增强, 所以先对 JDK SPI 机制 准备做一个分析.同时也建议大家多读优秀框架的源码. 1 SPI 简介 1.1 什么是 SPI SPI全称 Service Provider Interface ,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI 的作用就是为这些被扩展的

Jack Li 的博客 887

Java -- JDK中SPI机制

(),是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件Java SPI是一种以接口为基础,使用配置文件来加载(或称之为服务发现)的动态加载机制,主要使用JDK中来实现​SPI是一种动态替换发现的机制,比如有个接口,想运行时动态的给它添加实现,只需要添加一个实现。

MinggeQingchun的博客 2447

聊聊关于Java、Spring、Dubbo三者之前SPI机制的原理和区别

SPI全称为Service Provider Interface,是一种动态替换发现的机制,一种解耦非常优秀的思想,SPI可以很灵活的让接口和实现分离,让api提供者只提供接口,第三方来实现,然后可以使用配置文件的方式来实现替换或者扩展,在框架中比较常见,提高框架的可扩展性。简单来说SPI是一种非常优秀的设计思想,它的核心就是解耦、方便扩展。通过以上分析可以看出,实现SPI机制的核心原理就是通过IO流读取指定文件的内容,然后解析,最后加入一些自己的特性。

Java技术攻略的博客 283

Java/Spring/Dubbo三种SPI机制,谁更好?

往期热门文章:1、我用Java几分钟处理完30亿个数据... 2、炸了!Java多线程批量操作,居然有人不做事务控制 3、Spring Boot 中实现跨域的 5 种方式,你一定要知道! 4、终于用上分库分表了! 5、腾讯可视化, 低代码生成器,正式开源! 文章来源:https://c1n.cn/my8R6SPI 机制应用在了大家项目中的很多地方,在很多框架中也有普遍应用...

Java后端技术 454

java中的SPI机制

1 SPI机制简介     SPI的全名为Service Provider Interface.大多数开发人员可能不熟悉,因为这个是针对厂商或者插件的。在java.util.ServiceLoader的文档里有比较详细的介绍。简单的总结下java spi机制的思想。我们系统里抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象

司刚军的个人专栏 2万+

Dubbo 笔记(二) Dubbo 的 SPI 机制

Dubbo 的 SPI 机制 参考自: github: ExtensionLoader.java 敖丙:《Dubbo系列》-Dubbo SPI机制 SPI 是什么 ​ SPI (Service Provider Interface),是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。 ​ 简单来说就是用来解耦,实现插件的自由插拔。 使用场景 JDBC驱动加载案例:利用Java的SPI机制,我们可以根据

Wu_yongtao的博客 819
上一篇: 从Socket编程看HTTP服务器设计
下一篇: Dubbo Filter原理和使用场景
codingtu
codingtu 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 67粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值