https://blog.csdn.net/qwe123147369/article/details/111316396
springboot启动时,是依靠启动类的main方法来进行启动的,而main方法中执行的是SpringApplication.run() 方法,而 SpringApplication.run() 方法中会创建spring的容器,并且刷新容器。而在刷新容器的时候就会去解析启动类,然后就会去解析启动类上的@SpringBootApplication 注解,而这个注解是个复合注解,这个注解中有一个@EnableAutoConfiguration 注解,这个注解就是开启自动配置,这个注解中又有 @Import注解引入了一个 AutoConfigurationImportSelector 这个类,这个类会进过一些核心方法,然后去扫描我们所有jar包下的 META-INF 下的 spring.factories 文件,而从这个配置文件中取找key为 EnableAutoConfiguration 类的全路径的值下面的所有配置都加载,这些配置里面都是有条件注解的,然后这些条件注解会根据你当前的项目依赖的jar包以及是否配置了符合这些条件注解的配置来进行装载的。
这就是springboot自动配置的过程。
在 prepareContext() 方法中又调用 getAllSources() 方法,这个方法中,获取到的一个source就是启动类DemoApplication。然后去获取启动类,然后通过SpringApplication的 load() 方法,去加载启动类,然后在刷新容器的时候就会去将启动类在容器中进行实例化。
在刷新ApplicationContext容器时,调用register方法,开始解析启动类上的注解了。
@EnableAutoConfiguration 下的@Import(AutoConfigurationImportSelector.class) 这个注解
getAutoConfigurationEntry()
getCandidateConfigurations()
SpringFactroiesLoader.loadFactoryNames()
@Conditional注解扩展而来的,只是使用了不同的组合条件来判断是否需要加载和初始化当前Bean。
所以第一个端核心代码的意思是:
启动的时候会扫描所有jar包下 META-INF/spring.factories 这个文件。第二段代码的意思是将这些扫描到的文件转成Properties对象,后面两个核心代码的意思就是说将加载到的Properties对象放入到缓存中。
然后 getCandidateConfigurations() 方法,是只获取了key是EnableAutoConfiguration.class 的配置。