springboot的自动装配流程

相信大家在看springboot框架源码的时候一定已经看过spring的源码了吧 ,所以对于一些普通的操作我就不做解释了。
直接开始正题:首先是应用程序上下文的创建,我们知道在spring中我们一般使用自己创建的xmlApplicationContext,在spring中他会根据不同的情况来创建不同的上下文类型,但是一般我们不特别配置都是servlet环境对应的上下文对象
在这里插入图片描述
在这里插入图片描述
下一步实例化操作,我记得在mybatis中也有过调用构造方法创建的的对象的过程,等一下们去看一下再贴出来。在这里插入图片描述在这里插入图片描述
在这里插入图片描述
观察beanDefinition的注册器的创建过程做了哪些操作,一来就给逮住了 ,调用父类的无参构造方法执行创建beanFactory的操作:
在这里插入图片描述
在这里插入图片描述
第一个方法 获取了bean工厂和很多的属性 做以后处理使用。
在这里插入图片描述
第二个方法 相信大家一看就突然有那味了,那叫一个地道 在这里我们向beanFactory中注册的beanDefinition,好你个浓眉大眼的springboot居然不在refresh里面注册beanDefinition,这里就是和spring的一个区别了,springboot在refresh之前就已经创建好了beanFactory,同时还注册了一些beanDefinition,第一次看的时候我直接看refresh方法,就很疑惑这些bean是哪来的,还要注意的一点是我们注册这些bean信息的时候class对应的beanName不是它的类所在的位置了。
在这里插入图片描述
比如说第一个
![在这里插入图片描述](https://img-blog.csdnimg.cn/3db05cf401f84025a42d98f05955142f.png
在这里插入图片描述
好的 我们的上下文对象和bean工厂都已经创建好了,我们来看一看它下一步做了什么,先进入prepareContext方法。
其他的没什么好看的我们主要看一下load方法
在这里插入图片描述
为什么需要拿到我们的启动类的信息,并且加载喃,是因为启动类上有一个注解,大家可以点开它里面
它包含了许多我们需要初始化的信息,里面甚至包含了自动装配相关的类信息,所以我们需要将它扫描进来,做一些处理。
在这里插入图片描述
在这里插入图片描述
虽然会加载,但是我们应该明白,在此处不会做过多的处理,只是将它注册为一个beanDefinition,等待后续一起处理。
在这里插入图片描述
在这里插入图片描述
我们的prepareContext已经执行完毕,接下来是执行我们的refresh方法了,就是spring中的refresh
在这里插入图片描述
老spring了
在这里插入图片描述
我们最主要需要看的就是invokeBeanFactoryPostProcessor,执行bean工厂的后置增强处理器,其实它包含了两种一种是beanFactoryPostProcessor,另外的是BeanDefinitionRegistryPostProcessor,一个是用来对我们的bean工厂进行增强处理,另一种主要是进行bean定义信息的注册,mybatis的定义信息就是在这里注册的。这些postProcessor是我们工厂属性中的,他是在什么地方添加的喃,前两个在我们的refresh的prepareBeanFactory方法中,第三个在我们的postProcessBeanFactory中。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在处理完那里面的过后,我们就会去我们的beanDefinition中去寻找,我们先了解一下getBeanNamesForType,的作用如下图:
了解完这个过后,看一下我们下面那张图的红字注释,我们知道它这样做是分顺序,但是为什么分顺序需要多次去又找beanFactory里面的beanDefinition,可以看到方法都是一样的参数也是一样的,直接放一个缓存不就行了吗。这个问题困扰了我一阵,后来突然灵光一闪,想起来我们的执行过程中调用的接口可是BeanDefinitionRegistryPostProcessor的接口,那么它一定会在执行的过程中又创建一些beanDefinition,所以才会多次寻找。
在这里插入图片描述
好了,书归正题,第一次循环执行的接口其实就实现了我们的自动装配的功能,我们来仔细看一看:
直接调用invokeBeanDefinitionRegistryPostProcessors方法,执行它的接口,遍历执行所有bean注册器在这里插入图片描述

在这里插入图片描述
其实它主要找的就是我们的springboot的启动类,因为我们启动类的注解往里面点会发现许多的其他注解。
在这里插入图片描述
其他的我们都暂时不看,都是一些其他的处理,我们直接看Configuration注解处理,进入parse方法
在这里插入图片描述
在这里插入图片描述
可以看到在这个方法中首先获取该类所有的父类,因为有依赖关系,然后将父类挨个处理
在这里插入图片描述
直到进入:
在这里插入图片描述

我们直接进入最终方法里面:
一进入我们就可以看到里面全是我们的注解的解析处理在这里插入图片描述
这个方法的最后一句,观察是否还有父类。
在这里插入图片描述
进入import注解的相关,直接看到里面递归调用,所有的注解,知道找到import注解,然后给他放入数组中,然后实例化
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可能有一个问题就是我们之前是解析出了三个类 ,但是此处只有一个类,因为我们之前查出所有类有个实例化操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们接着上面的说:将那一个类进行处理操作
在这里插入图片描述
可能有点小疑问的就是为什么之前并不是这个属性,现在怎么通过grouping属性取值了,因为它在处理之前有一个foreach操作,将我们的参数装入了就是上面那张图,有个foreach操作。我们斌进入执行操作,我们进入getImports方法。
在这里插入图片描述
进入proceed方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
class对象传入,我们可以知道他是找EnableAutoConfiguration下面对应的类
在这里插入图片描述
直接进入sping源码中的文件夹下看有哪些
在这里插入图片描述
总算是找到我们要的了,这些类就是对不同的组间做的适配处理的类,下面还有很多我没有截取完
在这里插入图片描述
在这里插入图片描述
接下来类的创建细节,等待后续更新

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值