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

被折叠的 条评论
为什么被折叠?



