SpringBoot自动装配原理(自己理解笔记)

补充:SpringApplication的作用:

1.判断应用的类型是否为普通的项目还是web项目

2.查找并加载所有可用的的初始化器,并设置到initiliazer中

3.找到所有应用的程序监听器,设置到initlizer中

4.推断并设置main方法的定义类,找到运行的主类

5.加载一部分全局bean的监听器

首先ctrl+鼠标左键点击@SpringBootApplication 

@SpringBootApplication主要是由@SpringBootConfiguration,@EnableAutoConfiguration和@ComponentScan三个标注实现的。

首先是@ComponentScan,它的功能是扫描指定文件下的包

其次是@SpringBootConfiguration,根据它名字中有Configuration,学过spring的同学应该就会反应过来它是个配置类也就是声明是个SpringBoot的配置类并把它们封装bean注册到IOC容器中,我们继续ctrl+鼠标左键点击进入@SringBootConfiguration

 不难发现在@SpringBootConfiguration中有个@Configuration注解,表示它同时声明也是个spring的配置类,接下来我们再点击ctrl+鼠标左键点击@Configuration

 @Configuration中的@Component同时也表示它是个组件。

那么就是@SpringBootConfiguration是声明它是SpringBoot的配置类,其底下的@Configuration声明它是spring的配置类,然后最底下的@Component表示它是个组件,那么@SpringBootConfiguration就是声明它是个SpringBoot的配置类(也同时是一个spring组件)

然后就是第三个注解@EnableAutoConfiguration,我们ctrl+鼠标左键点击这个注解

 其中重要的就是@AutoConfigurationPackage以及@Import()中的AutoConfigurationImportSelector.class

首先我们继续进入@AutoConfigurationPackage(自动配置包)这个注解

 里面有个@Import(AutoConfigurationPackages.Register.class)也就是导入包的注册表,Register就是注册的意思,结合之前的@ComponentScan以及现在的@AutoConfigurationPackage下的Register,是不是可以理解为,首先扫描了当前(@SpingBootApplication)下的包然后把下面的获取包名字以及注解的名字(图二)为它们生成了注册表,来自动配置包,但这也只是配置了包并没有实现导入的功能

来,现在我们返回到@EnableAutoConfiguration中还有个@Import(AutoConfigurationImportSelector.class),我们继续ctrl+鼠标左键点击进入AutoConfigurationImportSelectors这个类

其中有个getAutoConfigurationEntry这个方法,看名字,获取自动配置的实体,是不是就是实现自动配置的主要方法,其中有个getCandidateConfigurations ,获取候选的配置,(Candidate是候选人的意思),现在我们来理一理逻辑,我们之前@ComponentScan和@AutoConfigurationPackage是不是获取了我们扫描的包以及包的信息,我们现在要装配他们,是不是就要从中筛选出候选也就是需要配置的配置,筛选完后,我们才装配他们。现在我们继续ctrl+鼠标左键点击getCandidateConfigurations这个方法

 从这个给图中我们有三个发现:

第一,最上面的红线,我们仍在AutoConfigurationImportSelectors这个类中,说明getCandidateConfiuration和getAutoConfigurationEntry这个方法同级,它们是同级调用

第二,就是List<String> configurations=SpringFactoriesLoader.loadFactoryNames()这个调用的方法,SpringFactoriesLoader是spring的工厂加载机制,这通常是来加载jar包并用来初始化的,其中有意思的是loadFactoryNames,它是用来获取加载的工厂名字并返回全限定类名

第三,就是loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader())这两个参数方法

首先我们ctrl+鼠标左键点击进入getSpringFactoriesLoaderFactoryClass()

 第一和之前一样,我们仍在AutoConfigurationImportSelectors这个类里面,getSpringFactoriesLoaderFactortClass这个方法也是同级调用

第二,就是它return的是EnableAutoConfiguration.class这个类,我们首先明白,我们当前的AutoConfigurationImportSelectors按照作用范围,我们是在EnableAutoConfiguration的里面,而现在时返回的是大的,按名字getSpringFactoriesLoaderFactortClass是获取Spring工厂加载的配置的类,结合之前的@AutoConfigurationPackage的名字以及其中的AutoConfigurationPackages.Register获取当下扫描的包以及注解并生成注册信息,是不是就是获取@SpringBootApplication主启动器所加载的所有组件

现在我们返回getCandidateConfigurations,那个getClassLoader()ctrl+鼠标左键点击进入

 是不是也是同级调用并且返回当前的类加载器!!!

参数完了,现在进入SpringFactoriesLoader.getFactoryName()这个方法

 首先我们进入了SpringFactoriesLoader这个工厂加载类,看loadFctoryNames这个方法,它获取了我们的类加载器,并且获取了加载配置的注册信息(之前的register),但是它仍是调用了loadSpringFactories,在loadSpringFactories中的Enumeration urls就通过类加载器获取spring工厂的地方,META-INF/spring.factories

接下来我们找到(毕竟是自动装配,自然是autoconfigure了),进入spring.factories

 

 ps:以后有自动装配的直接Shift双击,然后搜索XXXXAutoConfigure

(看源码很重要) 

这里用常用的WebmvcAutoConfguration为例,点击进入

 里面有很多的@ConfiguratonalOnXXX也就是条件判断,证明了并不是扫描包下得到的组件生成的注册表中全部的都会允许记载,只有通过条件的才能加载,也就是pom中(以web为例)

 需要有相应的启动器,那么被扫描到的组件才能被允许放行,才能被加载,被列为候选配置名单,才能被自动配置

总结---------------------------------0:34先睡觉了先,明天总结

2022/4/18 7:54

那么我们现在再来理一下自动配置的原理顺序:首先由@ComponetScan指明要被扫描的包有那些,然后通过@EnableAutoConfiguration中的@AutoConfiguratuonPackage获取到自动配置包信息,而@AutoConfigurationPackage又是通过@Import(AutoCnfigurationPackages.Register.class)来获取到被扫描到包的注册信息,然后@Import(AutoConfigurationImportSelector.class)通过AutoConfigurationImportSelector这个类中的getAutoConfigurationEntry来获取自动配置的实体,而getAutoConfigurationEntry又是通过同级调用getCnadidateConfiguration来获取候选候选配置信息,在getCandidateConfiguration中又是利用SpringFactoriesLoader.loaderFactoryName(同级调用getSpringFactoriesLoaderFactoryClass()获取@AutoConfigurationPackage扫描的包信息,getBeanClassLoader()获取类加载器)来对获取的包信息进行筛选,筛选出(MEAT-INF/spring.factories中)含有启动器的的配置信息,最后通过@SpringBootAutoConfiguratuon封装成bean,存放入IOC容器中,实现自动配置。

 如果有错误的地方欢迎指出,本人也是出入Spring Boot

(第一次写博客,欢迎指出错误)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值