OrderService orderService = ctx.getBean(OrderService.class);容器中的过程是什么?
1:>org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)
2:>org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
2.1:>org.springframework.beans.factory.support.AbstractBeanFactory#transformedBeanName 转换
beanName
2.2:>org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton 去缓存
中获取bean
2.3:>org.springframework.beans.factory.support.AbstractBeanFactory#getObjectForBeanInstance 对
缓存中的获取的bean进行后续处理
2.4:>org.springframework.beans.factory.support.AbstractBeanFactory#isPrototypeCurrentlyInCreation
判断原型bean的依赖注入
2.5 >org.springframework.beans.factory.support.AbstractBeanFactory#getParentBeanFactory 检查父
容器加载bean
2.6>org.springframework.beans.factory.support.AbstractBeanFactory#getMergedLocalBeanDefinition 将
bean定义转为RootBeanDifination
2.7>:检查bean的依赖(bean加载顺序的依赖)
2.8>:org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton根据
scope 的添加来创建bean
3>:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean创建
bean的方法
4>org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean 真
正的创建bean的逻辑
4.1>:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
调用构造函数创建对象
4.2>:判断是否需要提早暴露对象(mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName));
4.3>org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingletonFactory
暴露对象解决循环依赖
4.4>:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
给创建的bean进行赋值
4.5>:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean对
bean进行初始化
4.5.1>:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods
调用XXAware接口
4.5.2>applyBeanPostProcessorsBeforeInitialization 调用bean的后置处理器进行对处理
4.5.3>org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeInitMethods
对象的初始化方法
4.5.3.1>:org.springframework.beans.factory.InitializingBean#afterPropertiesSet 调用
InitializingBean的方法
4.5.3.2>:String initMethodName = mbd.getInitMethodName(); 自定义的初始化方法
5>:org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingleton 把创建好的实
例化好的bean加载缓存中
6>:org.springframework.beans.factory.support.AbstractBeanFactory#getObjectForBeanInstance对创建的
bean进行后续的加工