SpringBoot自动装配

@EnableAutoConfiguration注解:

对于新建的springboot项目 会自动生成一个主入口类 该类上会有一个注解@SpringBootApplication 在程序编译运行时 会通过该注解向IOC容器中注入相关的资源 那么它是如何实现的呢 点开@SpringBootApplication 会发现



该类上有个注解@EnableAutoConfiguration 该注解的功能就是给程序提供自动加载相关的资源 因为该类上有个


通过@Import(AutoConfigurationImportSelector.class),通过该注解引入一个AutoConfigurationImportSelector ,通过AutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。

AutoConfigurationImportSelector这个类中有个SpringFactoriesLoader.loadFactoryNames 如图:


该方法会去加载spring-boot-autoconfigure.jar/META-INF/spring.factories 配置文件 把 spring-boot-autoconfigure.jar/META-INF/spring.factories中每一个xxxAutoConfiguration文件都加载到容器中 看一下该配置文件

里面有许多的类的全路径 SpringFactoriesLoader.loadFactoryNames 会通过这些配置将资源添加进IOC容器

梳理一下加载流程@SpringBootApplication->@EnableAutoConfiguration->@Import(AutoConfigurationImportSelector.class)->AutoConfigurationImportSelector->SpringFactoriesLoader读取配置文件加载资源

SpringFactoriesLoader(以下功能参考 https://blog.csdn.net/zxc123e/article/details/80222967  感谢~~~)

SpringFactoriesLoader属于Spring框架私有的一种扩展方案(类似于Java的SPI方案java.util.ServiceLoader),其主要功能就是从指定的配置文件META-INF/spring-factories加载配置,spring-factories是一个典型的java properties文件,只不过Key和Value都是Java类型的完整类名,比如:

SpringFactoriesLoader根据配置文件 即根据@EnableAutoConfiguration的完整类名org.springframework.boot.autoconfig.EnableAutoConfiguration作为查找的Key,获得对应的一组@Configuration类。

SpringFactoriesLoader是一个抽象类,类中定义的静态属性定义了其加载资源的路径public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories",


此外还有三个静态方法:

loadFactories:加载指定的factoryClass并进行实例化。

loadFactoryNames:加载指定的factoryClass的名称集合。

instantiateFactory:对指定的factoryClass进行实例化。

在loadFactories方法中调用了loadFactoryNames以及instantiateFactory方法。


loadFactories方法首先获取类加载器,然后调用loadFactoryNames方法获取所有的指定资源的名称集合、接着调用instantiateFactory方法实例化这些资源类并将其添加到result集合中。最后调用AnnotationAwareOrderComparator.sort方法进行集合的排序。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容