学习springboot2的第5天(2021-12-04)14-自动配置【源码分析】初始加载自动配置类
第一个:
第二个:
第三个:
之前讲的是第三个:AutoConfigurationPackage
现在准备将它下面的:@Import(AutoConfigurationImportSelector.class)
看源码:
看一下这个类:
这个类它有一个方法叫做:selectImports
这个方法的作用是确定我们到底要给容器里面导入哪些组件呢?
都在返回值String数组里面。
研究这个方法:getAutoConfigurationEntry
这个方法是核心方法。
利用这个方法给容器中批量导入一些组件:
研究这个方法getAutoConfigurationEntry来确定导入的是哪些组件呢?
这个方法里面有一个很核心的变量configurations
一共有127个值。
说明这127个组件默认都是要导入到容器里面的。
这个方法getCandidateConfigurations是获取所有需要导入到容器里面的组件。
利用工厂加载得到所有组件。
最终还是需要看方法loadSpringFactories来看到底加载了哪些组件。
第一次执行的时候result为null
默认当前系统里面所有META-INF/spring.factories位置的文件。
数量:
148-21+1 = 127个
所以这些127个自动装配的组件是在配置文件里面写死了。
总结:
文件里面写死了springboot一启动就要给容器中加载的所有配置类(127)。
虽然我们127个场景的所有自动配置启动的时候默认全部加载最终会按需配置。
例如:
看这个类:AopAutoConfiguration
这个注解的意思就是:
只有有Advice这个类才会加载这个配置。
什么时候才会有Advice这个类呢?
发现你只有导了aspectj包的时候才会有Advice这个类。
springboot加载的核心:
启动的时候加载所有的配置组件(配置文件里面写死了)
但是最终按照条件装配规则进行按需分配:注解@ConditionalOnClass({xxx.class})