您的位置:首页 > 编程语言 > Java开发

Spring IOC(3)----bean实例化

2019-10-08 23:15 106 查看

前面一节说到invokeBeanFactoryPostProcessors方法的调用来注册bean定义,这次来看看finishBeanFactoryInitialization这个方法实例化非懒加载的单例bean。

1.从getBean到doGetBean先尝试从单例缓存池里面获取:DefaultSingletonBeanRegistry#getSingleton;

 

 

2.如果获取到了就返回了,如果获取不到则通过bean定义:AbstractBeanFactory#getMergedLocalBeanDefinition;

 

 

3.根据bean定义去实例化bean:AbstractAutowireCapableBeanFactory#createBean;

 

 

4.期间会对AOP的切面信息进行解析缓存:AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation;

 

5.spring真正干活的方法一般都是doXXX,创建bean:AbstractAutowireCapableBeanFactory#doCreateBean;

 

 

6.实例化一个bean的包装对象(BeanWrapper):AbstractAutowireCapableBeanFactory#createBeanInstance,该方法内部实现及其复杂。。。。之后判断是否是单例,将对象暴露到缓存中,用于解决循环依赖问题;

 

7.对bean属性进行赋值:AbstractAutowireCapableBeanFactory#populateBean

 

8.对dean进行处理:AbstractAutowireCapableBeanFactory#initializeBean

    1.回调Aware接口方法:AbstractAutowireCapableBeanFactory#invokeAwareMethods

    2.调用bean的后置处理器生成代理对象返回(有可能生成对象返回):AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization/AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization

 

9.最后添加到各级缓存中:DefaultSingletonBeanRegistry#addSingleton。

流程图:

 

 Spring IOC(1-3)的流程图可以拼出来一个完整的从前期准备到注册bean定义,再到实例的流程,完整的流程如下

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐