@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方法进行集合的排序。