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

在creatbean中
先看该beanName有没有设置后置处理器,如果有 则返回一个代理对象
spring内幕(七)bean的初始化之creatBean()方法_第1张图片

然后看doCreateBean方法
spring内幕(七)bean的初始化之creatBean()方法_第2张图片

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

有从提供者那获取bean instanceSupplier是一个回调接口
spring内幕(七)bean的初始化之creatBean()方法_第3张图片
从工厂方法中获取bean,该工厂方法要先通过配置解析到beanDefinition里面
spring内幕(七)bean的初始化之creatBean()方法_第4张图片

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

使用默认的构造函数绝对bean进行实例化
spring内幕(七)bean的初始化之creatBean()方法_第5张图片
最后还有 没有任何特殊处理 使用无参构造函数实例化
在这里插入图片描述

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

spring内幕(七)bean的初始化之creatBean()方法_第6张图片

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

那么再看下默认的策略里面instantiate方法spring内幕(七)bean的初始化之creatBean()方法_第7张图片

需要注意的是

这个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暴露出去
spring内幕(七)bean的初始化之creatBean()方法_第8张图片
将这个bean 放到了singletonFactories里面,也就是所谓的第三级缓存中
这样在填充属性的时候,发现有依赖到这个bean的 就可以从singletonFactories里面取出来。

spring内幕(七)bean的初始化之creatBean()方法_第9张图片

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

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

你可能感兴趣的:(spring源码学习专栏)