SpringBoot 3的两种SPI加载方式

发布于:2024-08-08 ⋅ 阅读:(115) ⋅ 点赞:(0)

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

加载类 加载文件
org.springframework.core.io.support.SpringFactoriesLoader META-INF/spring.factories
org.springframework.boot.context.annotation.ImportCandidates META-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进行了了解和分析


网站公告

今日签到

点亮在社区的每一天
去签到