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…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
