@TOC
目的:
不拘泥与具体细节,对spring bean的生成能有一个整体的把握。
图片整体预览
正文
spring bean
的生成主要分为两个阶段,第一个是bean Definition
的生成
,第二个是bean的生成。也就是本文的主要内容。
对于spring
实例初始一个bean
,我们主要分析一下几点
- 子类
beanDefinition
合并父类bean Definition
的一些数据; bean
实例化之前的操作介绍resolveBeforeInstantiation
(产生代理的时机)- 实例化bean的几种方式
createBeanInstance
- 工厂方法创建
- 带参数的构造方法创建
- 默认的构造方法创建
- 注入数学过程如何解决循环依赖
bean
实例化后属性的装填工作populateBean
- 名称注入
- 类型注入
- 初始化
bean initializeBean
方法调用- 处理 bean 的前置处理器
- 执行 init-method 方法
- 处理 bean 的后置处理器
以上几点是按照上图,方法的调用顺序依次介绍。也是bean
生成过程的顺序介绍。
子类beanDefinition
合并父类bean Definition
的一些数据;
这块主要是图片中这部分的介绍
子类的bean因为是继承了父类bean,所以在创建子类时需要合并一些父类的属性到子类中,主要是getMergedLocalBeanDefinition()
这个方法不是很重要,这里就不贴源码占用大家时间了。
bean
实例化之前的操作介绍resolveBeforeInstantiation
(产生代理的时机)
这个小结主要介绍的是下图这块的内容
贴个入口代码
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
我们创建代理是通过一个后置处理