
文章插图
这个方法主要完成的事情是:通过Bean的名字拿到对应的Class对象;如果当前Bean获取到的Class对象不为空且该RootDefintiton可以直接获取到该Bean,克隆一份Bean定义信息,方便之后使用 。
验证当前Bean上的@Override信息 。执行BeanPostProcessor,返回一个代理对象(如果存在代理的话), 如果不存在代理,则直接创建Bean
接下来我们来聊一下这个玩意——resolveBeforeInstantiation

文章插图
来吧,继续,看一下那个前置处理器逻辑

文章插图
后置处理器就不看了,就调用了所有的后置处理器,然后执行了一遍,没有其他逻辑 。
接下来继续我们的正题:doCreateBean

文章插图
其大致流程如上图:
先判断以后是否单例,然后从FactoryBean缓存中看一下是否存在正在创建的Bean,如果存在拿出,如果不存在则创建一个当前Bean的包装类实例 。然后拿到这个类的实例和实例类型,执行以后后置处理器 。
当前Bean是否为单例,是否允许循环依赖,时候正在进行创建,如果是,创建一个当前Bean的ObejctFactory以解决循环依赖的问题
填充Bean的属性,进行Bean的实例化 。
查看早期容器缓存中(缓存中的二级缓存中是否有该Bean) 。如果有,则说明存在循环依赖,则进行处理
先看循环依赖吧

文章插图
接着来,createBeanInstance

文章插图
Spring提供了三种方式创建对象的包装:
- 通过供给者对象对象直接创建 。obtainFromSupplier
- 通过工厂方法直接创建 。
- 默认创建 。构造方法是否需要自动注入构造方法不需要自动注入,调用默认的构造方法
我们按照代码执行顺序来,属性填充即populateBean
这个方法执行逻辑:
- 首先判断传入的Bean是否为null,如果为null则判断Bean定义信息中是否存在属性值,如果存在,异常;如果不存在跳过
- 当前Bean定义信息是否为合并以后的,如果是且此时的工厂中存在InstantiationAwareBeanPostProcessors,那么在属性填充之前进行修改Bean的信息
- 拿到所有的属性值,解析属性值的自动注入方式,Type或者Name,进行自动注入
- 判断是否存在InstantiationAwareBeanPostProcessors,修改之前设置的属性
- 判断是否存在依赖检查,检查依赖
- 属性赋值

文章插图
接下来看执行初始化方法,就是调用BeanPostprocessor,init等方法

文章插图
这个就是这个方法的执行流程图,相信到这个地方,大家应该对于为什么BeanPostProcessor的before方法会在init方法执行了解了 。这个方法的作用仅仅是用来进行一个生命周期的打印,对象在之前已经创建了 。
推荐阅读
- 安溪铁观音之知识大全,带你深入了解安溪铁观音茶叶
- 带你重新认识Linux系统的inode
- 一文带你了解Notta是什么
- CPU越来越热吗 一文带你看懂怎么选
- 带你实现一个静态服务器,超详细
- 江城国庆古茶山,带你走贺开古茶山
- 带你了解真正黑客入侵的常用手段及防护措施
- 42 张图带你揭秘后端技术都要学啥?
- 一篇文章带你了解HTML语法
- 贫血吃什么好 四款食谱带你远离贫血
