SpringBoot 3的两种SPI加载方式

embedded/2024/10/21 9:25:42/

spring boot 2.7.0发布后, 自动配置类的加载方式就发生了改变,原来从META-INF/spring.factories文件中加载,变为了从META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中加载,对应的加载实现类发生了改变,两者的加载实现类如下:

加载类加载文件
org.springframework.core.io.support.SpringFactoriesLoaderMETA-INF/spring.factories
org.springframework.boot.context.annotation.ImportCandidatesMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

SpringFactoriesLoader

目前像org.springframework.context.ApplicationContextInitializer, org.springframework.boot.SpringApplicationRunListener, 以及org.springframework.context.ApplicationListener等SPI仍是由SpringFactoriesLoader进行加载,这部分没有变化。

但是原来的org.springframework.boot.autoconfigure.EnableAutoConfiguration已经从spring.factories中移徐,即不再由SpringFactoriesLoader进行加载,而是换成由ImportCandidates进行加载。

ImportCandidates

从类注释上说明,该类从springboot 2.7开始用于自动配置类的import逻辑:
// todo ImportCandidates类注释截图

用于加载的load(Class<?> annotation, ClassLoader cl)方法的加载逻辑也很清晰,指定Annotation类,从固定路径中加载相应的SPI扩展类:
在这里插入图片描述

自动配置类为例,对应的Annotation类为org.springframework.boot.autoconfigure.AutoConfiguration, 加载路径就是:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

这部分处理逻辑在AutoConfigurationImportSelector.getAutoConfigurationEntry(AnnotationMetadata)方法中,该方法主要获取自动配置的入口:
在这里插入图片描述
在这里插入图片描述

后续

目前可能有其它的API也是由ImportCandidates加载,但没有继续深入了, 在以后也将会有越来越多的SPI扩展由ImportCandidates加载,所以简单的对ImportCandidates进行了了解和分析


http://www.ppmy.cn/embedded/90191.html

相关文章

JVM高级特性

JVM高级特性 内存管理 jvm是自动内存管理的 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域 有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进程的启动而一直存在&#xff0c;有些…

安卓基本布局(上)

文章目录 LinerLayout线性布局RelativeLayout相对布局根据父容器定位根据兄弟组件定位margin偏移padding填充 LinerLayout线性布局 以水平或垂直的方式来排列界面中的控件。 常用属性详细描述orientation布局中组件的排列方式。horizonta&#xff1a;水平&#xff1b;vertical…

nginx的反向代理及负载均衡

nginx的反向代理 安装包链接https://nginx.org/download/nginx-1.26.1.tar.gz yum -y install gcc gcc-c pcre-devel openssl-devel [rootstaticserver ~]# tar -xzvf nginx-1.26.1.tar.gz [rootstaticserver nginx-1.26.1]#./configure --prefix/usr/local/nginx --userngi…

【JVM内存】系统性排查JVM内存问题的思路

【JVM内存】系统性排查JVM内存问题的思路 背景 前言 遇到过几次JVM堆外内存泄露的问题&#xff0c;每次问题的排查、修复都耗费了不少时间&#xff0c;问题持续几月、甚至一两年。我们将这些排查的思路梳理成一套系统的方法&#xff0c;希望能给对JVM内存分布、内存泄露问题…

CTFSHOW 萌新 web9 解题思路和方法(利用system函数执行系统命令)

点击题目链接&#xff0c;从题目页面显示的代码中可以看到我们可以使用命令执行漏洞查看网站的文件&#xff1a; 我们首先使用system函数并使用 ls 命令查看当前目录下的所有文件&#xff1a; 因为题目中提示flag在config.php文件中&#xff0c;所有可以直接读取该文件 当然&am…

alibaba cloud linux+JDK+TOMCAT+NGINX+PHP+MYSQL配置实践

CentOs要停止维护了&#xff0c;一直在服务器上用的CentOs7也最迟到2024年6月了&#xff0c;这次给公司新购一台备用服务器&#xff0c;在选择操作系统的时候&#xff0c;考虑了一下&#xff0c;决定试用一下阿里云的alibaba cloud linux。 alibaba cloud linux分为2和3版本&am…

window bat批处理脚本

参考&#xff1a; https://www.cnblogs.com/dirgo/p/18108455 https://blog.csdn.net/AnChenliang_1002/article/details/131288871 https://www.cnblogs.com/jingxian666/p/16814375.html 什么是BAT 全称即Batch&#xff0c;批处理&#xff0c;是一类可执行的文本文件&#…

Stable Diffusion绘画 | 文生图设置详解—随机种子数(Seed)

随机种子数&#xff08;Seed&#xff09; Midjourney 也有同样的概念&#xff0c;通过 --seed 种子数值 来使用。 每次操作「生成」所得到的图片&#xff0c;都会随机分配一个 seed值&#xff0c;数值不同&#xff0c;生成的画面就会不同。 默认值为 -1&#xff1a;每次随机分…