spring内幕(七)bean的初始化之creatBean()方法

本文详细探讨了Spring框架中Bean的初始化过程,从`creatBean()`方法开始,涉及后置处理器、`doCreateBean()`方法、`createBeanInstance()`、无参构造函数的`instantiateBean()`以及Cglib子类化策略。在Bean实例化过程中,重点解释了MethodOverrides的作用,如何处理`lookup-method`和`replace-method`属性,以及如何解决循环依赖问题。Bean生命周期的第一阶段——创建阶段至此结束,接下来是属性初始化和初始化方法的调用。

在creatbean中
先看该beanName有没有设置后置处理器,如果有 则返回一个代理对象
在这里插入图片描述

然后看doCreateBean方法
在这里插入图片描述

在doCreateBean方法里面
createBeanInstance方法将会创建一个对象
在这里插入图片描述
在createBeanInstance方法里面

有从提供者那获取bean instanceSupplier是一个回调接口
在这里插入图片描述
从工厂方法中获取bean,该工厂方法要先通过配置解析到beanDefinition里面
在这里插入图片描述

使用指定注入的构造函数进行实例化
在这里插入图片描述

使用默认的构造函数绝对bean进行实例化
在这里插入图片描述
最后还有 没有任何特殊处理 使用无参构造函数实例化
在这里插入图片描述

这里我们只看无参构造函数实例化 也就是instantiateBean()方法

在这里插入图片描述

默认的实例化策略是CglibSubclassingInstantiationStrategy
在这里插入图片描述

那么再看下默认的策略里面instantiate方法在这里插入图片描述

需要注意的是

这个MethodOverrides ,是方法重写集,用于确定运行时springIOC容器会重写托管对象的哪些方法
methodOverrides列表 记录的是bean的属性中包含有lookup-method和replace-method属性的bean
lookup-method 是当单例bean依赖非单例bean的时候,能够每次重新创建非单例bean的时候使用
replace-method则是直接替换整个方法,用于替换的bean需要实现MethodReplacer接口 ,可以替换掉指定的方法

拥有以上步骤的 需要cglib来动态生成子类代理 来解决 靠反射创建原来的实例无法解决

以上就是完成了一个bean实例的创建。
此时已经有了一个bean对象,但是还不可以使用,因为其依赖的属性还没有初始化。

此时流程刚从createBeanInstance中返回,回到了doCreateBean方法
bean已经创建好了对象, 但是属性尚未填充,但是为了解决循环依赖
此时可以作为早期bean暴露出去
在这里插入图片描述
将这个bean 放到了singletonFactories里面,也就是所谓的第三级缓存中
这样在填充属性的时候,发现有依赖到这个bean的 就可以从singletonFactories里面取出来。

在这里插入图片描述

bean的声明周期,第一阶段 创建bean 就完成了 核心方法是instantiateBean

接下来是初始化属性,和调用初始化方法
再就是bean的使用 和销毁阶段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值