Spring03-容器创建bean的过程.

springBean创建过程

比如我们容器中 TulingLog tulingLog = tcx.getBean(TulingLog.class); 容器中的过程是什么?

容器中的过程是什么?

1
2
3
4
5
6
7
8
9
10
i1:>org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String) 
i2>org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
i3>:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean
创建bean的方法
i4>org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
真正的创建bean的逻辑
i5>:org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingleton
把创建好的实例化好的bean加载缓存中
i6>:org.springframework.beans.factory.support.AbstractBeanFactory#getObjectForBeanInstance
对创建的bean进行后续的加工

doGetBean创建主要过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
i2.1>:org.springframework.beans.factory.support.AbstractBeanFactory#transformedBeanName 
转换beanName
i2.2>:org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton
去缓存中获取bean
i2.3>:org.springframework.beans.factory.support.AbstractBeanFactory#getObjectForBeanInstance
对缓存中的获取的bean进行后续处理
i2.4>:org.springframework.beans.factory.support.AbstractBeanFactory#isPrototypeCurrentlyInCreation
判断原型bean的依赖注入
i2.5>:org.springframework.beans.factory.support.AbstractBeanFactory#getParentBeanFactory
检查父容器加载bean
i2.6>:org.springframework.beans.factory.support.AbstractBeanFactory#getMergedLocalBeanDefinition
将bean定义转为RootBeanDifination
i2.7>:检查bean的依赖(bean加载顺序的依赖)
i2.8>:org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton
根据scope的添加来创建bean

doCreateBean具体创建流程:

1
2
3
4
5
6
7
8
i4.1>:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance 
调用构造函数创建对象
i4.2>:判断是否需要提早暴露对象(mbd.isSingleton() && this.allowCircularReferences && i sSingletonCurrentlyInCreation(beanName));
i4.3>org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingletonFactory
暴露对象解决循环依赖
i4.4>:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
给创建的bean进行赋值 i4.5>:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean
对bean进行初始化

initializeBean初始化bean过程

1
2
3
4
5
6
7
8
9
i4.5.1>:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods 
调用XXAware接口
i4.5.2>applyBeanPostProcessorsBeforeInitialization 调用bean的后置处理器进行对处理
i4.5.3>org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeInitMethods
对象的初始化方法
i4.5.3.1>:org.springframework.beans.factory.InitializingBean#afterPropertiesSet
调用InitializingBean的方法
i4.5.3.2>:String initMethodName = mbd.getInitMethodName();
自定义的初始化方法