spring内幕(七)bean的初始化之creatBean()方法
在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的使用 和销毁阶段。