SpringBoot SPI
参考
https://blog.csdn.net/Peelarmy/article/details/106872570
https://javaguide.cn/java/basis/spi.html#%E4%BD%95%E8%B0%93-spi
SPI
SPI(service provider interface)是JDK提供的服务发现机制。以JDBC为例,JDK提供JDBC接口,在包java.sql.*。MYSQL, ORACLE各自提供JDBC实现类,分别出包:mysql-connector-j, ojdbc10。
SPI将服务接口与服务实现解耦。调用者动态配置JDBC实现包,实现动态加载数据库连接,而不是在代码中显式定义。
与 API的区别
API(Application Programming Interface)是服务提供者的接口,有接口,有实现。调用方直接可以用。比如后端向前端提供的接口。
SPI是服务接口,它只有接口,没有接口的实现。只定义规则。具体实现由不同的包自己定义。
JDK SPI
SPI是一种思想,JDK的实现是java.util.ServiceLoader类和/src/META-INF/接口全限定类名文件。
public interface IShout {void shout();
}
public class Cat implements IShout{@Overridepublic void shout() {System.out.println("catcat");}
}
public class Dog implements IShout{@Overridepublic void shout() {System.out.println("dogdog");}
}
在/src/META-INF目录下新增配置文件,文件名是接口全限定类名,文件内容是接口实现者的全限定类名。
文件名
/src/META-INF/services/com.test.spi.IShout
文件内容
com.test.spi.Cat
com.test.spi.Dog
配置好后,ServiceLoader就自动实现加载文件中所有类。
public static void main(String[] args) {ServiceLoader<IShout> serivceLoader = ServiceLoader.load(IShout.class);Iterator<IShout> iterator = serivceLoader.iterator();while (iterator.hasNext()) {IShout shout = iterator.next();shout.shout();}
}
SpringBoot SPI
SpringBoot SPI是对JDK SPI的扩展。
SpringBoot 2的SPI实现是在/META-INF/spring.factories文件用一组键值对表示接口与实现。
SpringBoot 3的SPI实现是在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件直接写实现类。这与JDK SPI保持一致。
加载流程
SpringBoot启动时,@EnableAutoConfiguration 注解会扫描自动配置类。

图中getCandidateConfiguration()方法解析META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中的内容。
其中,前2行来自本springboot项目的src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。之后的org.springframework.*来自\spring-boot-autoconfigure-3.3.5.jar!\META-INF\spring\org.springframework.boot.autoconfigure.AutoConfiguration.imports文件。
自定义项目src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports应用场景:SpirntBoot3无法自动装配DRUID
@Import注解
@Import注解可以将类放入IOC容器。
第一种用法是导入普通类。典型场景:自定义starter时引入@Configuration修饰的配置类,使得配置类中定义的bean都进入IOC容器。
第二种用法是导入ImportSelector接口的实现类,@Import注解将ImportSelector接口的String[] selectImports(AnnotationMetadata importingClassMetadata)方法返回的类放入IOC容器。AnnotationMetadata 是@Import标注的Class对象的元信息。
图中AutoConfigurationImportSelector是ImportSelector接口的实现类,154个类就是这样放入IOC容器的。
第三种用法是导入ImportBeanDefinitionRegistrar接口的实现类,@Import注解将执行ImportBeanDefinitionRegistrar接口的void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry)方法。它不返回对象,而是对已有的BeanDefinitionRegistry进行修饰或增强。
典型场景:自定义一个接口。在接口上@Import(ImportBeanDefinitionRegistrar实现类)。然后在实现类里根据自定义接口的参数修改bean。
相关文章:
SpringBoot SPI
参考 https://blog.csdn.net/Peelarmy/article/details/106872570 https://javaguide.cn/java/basis/spi.html#%E4%BD%95%E8%B0%93-spi SPI SPI(service provider interface)是JDK提供的服务发现机制。以JDBC为例,JDK提供JDBC接口,在包java.sql.*。MY…...
uniappp配置导航栏自定义按钮(解决首次加载图标失败问题)
1.引入iconfont的图标,只保留这两个文件 2.App.vue引入到全局中 import "./static/fonts/iconfont.css"3.pages.json中配置text为图标对应的unicode {"path": "pages/invite/invite","style": {"h5": {"…...
【Apache paimon】-- 集成 hive3.1.3 异常
目录 1、场景再现 Step1:在 hive cli beeline 执行创建 hive paimon 表 Step2:使用 insert into 写入数据 Step3:抛出异常 2、原因分析 Step1:在 yarn resource manager 作业界面查询 hive sql mr job 的 yarn log Step2:搜索job 使用的 zstd jar 版本 Step3:定…...
基于docker部署Nacos最新版本-国内稳定镜像
介绍 当前微服务架构常用的配置中心,本文推荐的是阿里云开源的nacos,截止发布本文为止,最新的nacos稳定版本为2.4.3 拉取镜像 //这个是国内目前可以下载的成熟的nacos镜像仓库,默认的docker hub需要不断的翻墙才可以下载 docke…...
云计算中的Hive操作详解
文章目录 云计算中的Hive操作详解一、引言二、Hive的基本操作1、创建表2、导入数据3、数据查询4、分区表操作 三、使用示例1、字符串处理函数2、数据类型转换 四、总结 云计算中的Hive操作详解 一、引言 Hive是云计算中一个非常重要的组件,它是基于Hadoop的一个数…...
UE4_控件蓝图_制作3D生命血条
一:效果图如下: 二、实现步骤: 1、新建敌人 右键蓝图类 选择角色, 重命名为BP_Enemytest。 双击打开,配置敌人网格体 修改位置及朝向 效果如下: 选择合适的动画蓝图类: 人物就有了动作&#x…...
11篇--图像边缘检测
图像梯度 要学习图像边缘检测,要先了解图像梯度的概念,我们正是通过梯度值来区分边缘像素点的 处于边缘附近的像素点与周围像素点的差距很大(不然不会有边缘呈现),所以给边缘附近的的梯度之变化很快,通过…...
宝塔SSL证书申请失败,报错:申请SSL证书错误 module ‘OpenSSL.crypto‘ has no attribute ‘sign‘(已解决)
刚安装宝塔申请SSL就报错:申请SSL证书错误 module OpenSSL.crypto has no attribute sign 面板、插件版本:9.2.0 系统版本:Alibaba Cloud Linux 3.2104 LTS 问题:申请SSL证书错误 module OpenSSL.crypto has no attribute sign…...
(已开源) 详解4D Radar数据集K-Radar
本文介绍一个4D Radar公开数据集:KAIST-Radar(简称K-Radar,由AVELab提供)是一个新型的大规模目标检测数据集和基准测试集,包含35000帧4D雷达张量(4DRT)数据。本文主要贡献有: 本文提…...
基于RK3588机器人控制器+3D视觉传感器的送餐机器人解决方案
送餐机器人 通过搭载3D视觉传感器信迈机器人控制器,送餐机器人可以在复杂的餐厅环境中灵活避障通行,极大地提升餐品配送效率,改善用户用餐体验,并显著降低店家经营成本。 高峰期送餐难,曾一直是送餐机器人的行业痛点。…...
基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 数据处理
基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 数据处理 flyfish 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_LoRA配置如何写 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_单图推理 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_原模型_单图推理 基于Q…...
Microi吾码|开源低代码.NET、VUE低代码项目,表单引擎介绍
Microi吾码|开源低代码.NET、VUE低代码项目,表单引擎介绍 一、摘要二、Microi吾码介绍2.1 功能介绍2.2 团队介绍2.3 上线项目案例 三、Microi吾码表单引擎是什么?四、Microi吾码表单引擎功能4.1 模块引擎 - 由表单引擎驱动4.2 流程引擎 - 由表…...
[Ubuntu] Linux命令收集
1、移动文件夹内的所有文件和子文件夹: 如果你想移动一个文件夹内的所有内容到另一个目录,但不移动该文件夹本身,你可以使用以下命令: 源:/home/ubuntu/www/demo/web下的所有文件及文件夹; 目标…...
鸿蒙应用ArkTS开发-利用axios进行网络请求(实现前后端交互)
引言: 我们上一章实现了简单的登录注册页面,今天小编来带着大家实现完整的登录注册功能。 一、后端的搭建 Spring Boot介绍:Spring Boot是一个用于简化Spring应用程序开发的开源框架。它通过自动配置、内置服务器和预设的最佳实践࿰…...
【开源】使用环信UIKit for uniapp 做一个IM即时聊天应用
环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开发的一款即时通讯 UI 组件库,提供各种组件实现会话列表、聊天界面、联系人列表及后续界面等功能,帮助开发者根据实际业务需求快速搭建包含 UI 界面的即时通讯应用。 本文教大家使用环信 uniapp UIKit 快…...
计算机网络知识点全梳理(一.TCP/IP网络模型)
目录 TCP/IP网络模型概述 应用层 什么是应用层 应用层功能 应用层协议 传输层 什么是传输层 传输层功能 传输层协议 网络层 什么是网络层 网络层功能 网络层协议 数据链路层 什么是数据链路层 数据链路层功能 物理层 物理层的概念和功能 写在前面 本系列文…...
神州数码DCME-320 online_list.php存在任意文件读取漏洞
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...
神经网络基础-神经网络搭建和参数计算
文章目录 1.构建神经网络2. 神经网络的优缺点 1.构建神经网络 在 pytorch 中定义深度神经网络其实就是层堆叠的过程,继承自nn.Module,实现两个方法: __init__方法中定义网络中的层结构,主要是全连接层,并进行初始化。…...
Linux入门攻坚——41、Linux集群系统入门-lvs(2)
lvs-dr:GATEWAY Director只负责请求报文,响应报文不经过Director,直接由RS返回给Client。 lvs-dr的报文路线如上图,基本思路就是报文不会回送Director,第①种情况是VIP、DIP、RIP位于同一个网段,这样&…...
音视频入门基础:MPEG2-TS专题(17)——FFmpeg源码中,解析TS program map section的实现
一、引言 由《音视频入门基础:MPEG2-TS专题(16)——PMT简介》可以知道,PMT表(Program map table)由一个或多个段(Transport stream program map section,简称TS program map sectio…...
LFM2.5-1.2B-Thinking-GGUF压力测试与性能调优:寻找最佳并发参数
LFM2.5-1.2B-Thinking-GGUF压力测试与性能调优:寻找最佳并发参数 1. 为什么需要压力测试 当你把LFM2.5-1.2B-Thinking-GGUF模型部署上线后,最担心的问题可能就是:这个服务能承受多少用户同时访问?会不会在高并发时崩溃ÿ…...
商家做小程序需要考虑哪些关键问题?
商家做小程序需要考虑哪些关键问题?在实际业务中,商家是否要做小程序,核心并不在于技术本身,而在于是否能够解决获客、转化与用户沉淀的问题。小程序是一种依托平台运行的轻量级应用,主要用于连接用户、承载交易与优化…...
数聚智连转战港交所:年营收16亿 净利4340万 蓝标与险峰是股东
雷递网 雷建平 4月2日北京数聚智连科技股份有限公司(简称:“数聚智连”)日前递交招股书,准备在港交所上市。数聚智连曾向深交所创业板递交招股书,计划募资8亿元,最终IPO被终止,此番是数聚智连转…...
光通信行业彻底爆了!三项世界纪录背后藏着多少财富密码
在6G尚未正式投入商业应用之际,我国的科研工作者已然悄然斩获了三项世界纪录?于此同时,全球范围内的人工智能领域的大型企业正大肆投入资金用于提升算力,进而直接促使光模块市场变得异常火爆。这背后所蕴含的不仅仅是技术层面的突…...
如何让老旧Mac重获新生?OpenCore Legacy Patcher终极改造指南
如何让老旧Mac重获新生?OpenCore Legacy Patcher终极改造指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款开源…...
Swift-All部署教程:快速搭建多模型推理与微调环境
Swift-All部署教程:快速搭建多模型推理与微调环境 1. 从零开始:为什么你需要Swift-All? 如果你正在研究大模型,或者想把大模型用在实际项目里,大概率会遇到这几个头疼的问题: 模型太多,下载太…...
开源阅读鸿蒙版完整指南:打造你的专属数字图书馆
开源阅读鸿蒙版完整指南:打造你的专属数字图书馆 【免费下载链接】legado-Harmony 开源阅读鸿蒙版仓库 项目地址: https://gitcode.com/gh_mirrors/le/legado-Harmony 开源阅读鸿蒙版是一款专为鸿蒙系统用户设计的免费开源电子书阅读器,它彻底改变…...
openclaude:模型接入 Code 工具链
作为一名长期关注人工智能工程化落地的开发者,我深知本地大模型在隐私保护和成本控制上的优势,但往往苦于缺乏像 Claude Code 那样强大的工具调用能力。很多时候,我们拥有强大的模型(如 DeepSeek、Ollama 本地部署)&am…...
MeteorSeed
从0构建WAV文件:读懂计算机文件的本质 虽然接触计算机有一段时间了,但是我的视野一直局限于一个较小的范围之内,往往只能看到于算法竞赛相关的内容,计算机各种文件在我看来十分复杂,认为构建他们并能达到目的是一件困难…...
气动元器件选型(工业自动化场景实战指南)
1. 气动技术基础与工业自动化适配性 气动技术作为工业自动化领域的核心驱动方式之一,其本质是通过压缩空气实现能量传递。想象一下,就像我们用吸管吹动纸团一样简单直接——空压机将电动机的旋转动能转化为气压能,再通过各类阀门控制气流方向…...
