2021-10-21 SpringBoot自动装配原理

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 的配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值