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{
    @Override
    public void shout() {
        System.out.println("catcat");
    }
}
public class Dog implements IShout{
    @Override
    public 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 2SPI实现是在/META-INF/spring.factories文件用一组键值对表示接口与实现。
SpringBoot 3SPI实现是在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对象的元信息。
图中AutoConfigurationImportSelectorImportSelector接口的实现类,154个类就是这样放入IOC容器的。

第三种用法是导入ImportBeanDefinitionRegistrar接口的实现类,@Import注解将执行ImportBeanDefinitionRegistrar接口的void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry)方法。它不返回对象,而是对已有的BeanDefinitionRegistry进行修饰或增强。
典型场景:自定义一个接口。在接口上@Import(ImportBeanDefinitionRegistrar实现类)。然后在实现类里根据自定义接口的参数修改bean

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/937325.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux部署ansible自动化运维

ansible自动化运维 1&#xff0c;编写ansible的仓库&#xff08;比赛已经安装&#xff0c;无需关注&#xff09; 1、虚拟机右击---设置---添加---CD/DVD驱动器---完成---确定 2、将ansible.iso的光盘连接上&#xff08;右下角呈绿色状态&#xff09; 3、查看光盘挂载信息 df -h…

Java——网络编程(中)—TCP通讯(上)

一 (网络编程常用类) (Java为了跨平台&#xff0c;在网络应用通信时是不允许直接调用操作系统接口的&#xff0c;而是由java.net包来提供网络功能。下面来介绍几个java.net包中的常用的类) 1 InetAddress类的使用 (封装计算机的IP地址和DNS) (这个类没有构造方法——>如…

SQL server学习05-查询数据表中的数据(上)

目录 一&#xff0c;基本格式 1&#xff0c;简单的SQL查询语句 2&#xff0c;关键字TOP 3&#xff0c;关键字DISTINCT 二&#xff0c;模糊查询 1&#xff0c;通配符 三&#xff0c;对结果集排序 1&#xff0c;不含关键字DISTINCT 2&#xff0c;含关键字DISTINCT 3&…

Gitlab ci/cd

关于gitlab ci/cd&#xff0c;就是实现DevOps的能力&#xff0c;即Development &Operations的缩写&#xff0c;也就是开发&运维。CI/CD 指的是软件开发的持续集成方法&#xff0c;我们可以持续构建、测试和部署软件。通过持续方法的迭代能使得我们减少在错误代码或者错…

Leetcode42-环形链表

题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使…

计算机网络错题

文章目录 码分复用透明传输差错检测停止-等待协议回退N帧协议CSMA/CD协议以太网交换机Vlanip地址的无分类编制方法ip地址的应用规划ip数据包的发送和转发过程路由信息协议IPI2016201720202022 2.5信道 码分复用 透明传输 差错检测 停止-等待协议 回退N帧协议 CSMA/CD协议 以太网…

改进系列(5):在ResNet网络添加SelfAttention自注意力层实现的遥感卫星下的土地利用情况图像分类

目录 1. ResNet介绍 2. SelfAttention 层 3. ResNet34 SelfAttention 4. 遥感卫星下的土地使用情况分类 4.1 土地使用情况数据集 4.2 训练 4.3 训练结果 4.4 推理 1. ResNet介绍 ResNet&#xff08;残差网络&#xff09;是一种深度卷积神经网络模型&#xff0c;由Ka…

ARM循环程序和子程序设计

1、计算下列两组数据的累加和并存入到sum1和 sum2 单元中。datal:0x12,0x935,0x17,0x100,0x95,0x345。 data2:0x357,0x778,0x129,0x188,0x190,0x155,0x167。 1.定义数据段 ;定义数据段&#xff0c;类型为data(表示为数据段)&#xff0c;权限为可读可写(程序可以读取和修改这…

蓝桥杯刷题——day5

蓝桥杯刷题——day5 题目一题干解题思路一代码解题思路二代码 题目二题干解题思路代码 题目一 题干 给定n个整数 a1,a2,⋯ ,an&#xff0c;求它们两两相乘再相加的和&#xff0c;即&#xff1a; 示例一&#xff1a; 输入&#xff1a; 4 1 3 6 9 输出&#xff1a; 117 题目链…

1_linux系统网络性能如何优化——几种开源网络协议栈比较

之前合集《计算机网络从入门到放弃》第一阶段算是已经完成了。都是理论&#xff0c;没有实操&#xff0c;让“程序猿”很难受&#xff0c;操作性不如 Modbus发送的报文何时等到应答和 tcp通信测试报告单1——connect和send。开始是想看linux内核网络协议栈的源码&#xff0c;然…

opencv——识别图片颜色并绘制轮廓

图像边缘检测 本实验要用到Canny算法&#xff0c;Canny边缘检测方法常被誉为边缘检测的最优方法。 首先&#xff0c;Canny算法的输入端应为图像的二值化结果&#xff0c;接收到二值化图像后&#xff0c;需要按照如下步骤进行&#xff1a; 高斯滤波。计算图像的梯度和方向。非极…

Edge SCDN深度解析,边缘安全加速的创新实践

边缘安全加速&#xff08;Edge Secure Content Delivery Network&#xff0c;SCDN&#xff09;是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术&#xff0c;智能调度使用户就近获取所需内容&#xff0c;为…

软考高级架构 —— 10.6 大型网站系统架构演化实例 + 软件架构维护

10.6 大型网站系统架构演化实例 大型网站的技术挑战主要来自于庞大的用户&#xff0c;高并发的访问和海量的数据&#xff0c;主要解决这类问题。 1. 单体架构 特点: 所有资源&#xff08;应用程序、数据库、文件&#xff09;集中在一台服务器上。适用场景: 小型网站&am…

Golang囊地鼠gopher

开发知识点-golang 介绍红队专题-Golang工具Fscan简介主要功能ubuntu 安装windows 安装常用命令:项目框架源文件common目录Plugins目录Webscan目录入口点插件扫描类型爆破插件common.ScantypeWebtitle函数webpoc扫描POC 执行CEL-GO 实践CEL指纹识别免杀源码特征参考链接红队专…

多分类交叉熵与稀疏分类交叉熵

总结: 标签为 One-hot 编码的多分类问题,用分类交叉熵对于标签为整数的多分类问题,用稀疏分类交叉熵稀疏分类交叉熵内部会将整数标签转换为 One-hot 编码,而如果标签已经是 One-hot 编码的形式,再使用稀疏分类交叉熵就会多此一举。 算例 假设我们有三个类别:A、B 和 C。…

360极速浏览器不支持看PDF

360安全浏览器采用的是基于IE内核和Chrome内核的双核浏览器。360极速浏览器是源自Chromium开源项目的浏览器&#xff0c;不但完美融合了IE内核引擎&#xff0c;而且实现了双核引擎的无缝切换。因此在速度上&#xff0c;360极速浏览器的极速体验感更佳。 展示自己的时候要在有优…

零基础微信小程序开发——小程序的宿主环境(保姆级教程+超详细)

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

麒麟信安推出支持信创PC的新一代云桌面方案,助力政务信创高效安全运维

12月11日&#xff0c;在第二届国家新一代自主安全计算系统产业集群融通生态大会上&#xff0c;麒麟信安发布了支持信创PC的新一代云桌面方案&#xff0c;该方案是基于国际TCI架构实现国产PC机云化纳管在国内的首次发布&#xff0c;并与银河麒麟桌面操作系统、长城国产PC整机实现…

vim优化

1.编辑如下内容&#xff1a; cat > /root/.vimrc <<EOF set tabstop2 " 设置 Tab 为 2 个空格 set shiftwidth2 " 设置自动缩进为 2 个空格 set expandtab " 将 Tab 转换为空格 " 基本设置 set number syntax on" 快捷键设置…

hive—常用的日期函数

目录 1、current_date 当前日期 2、now() 或 current_timestamp() 当前时间 3、datediff(endDate, startDate) 计算日期相差天数 4、months_between(endDate, startDate) 日期相差月数 5、date_add(startDate, numDays) 日期加N天 6、date_sub(startDate, numDays) 日期减…