从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逻辑:
用于加载的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进行了了解和分析