spring IoC容器构造bean过程简单分析
Spring构造bean和管理初始化生命周期的工作在AbstractAutowireCapableBeanFactory中处理,分为构造bean和后续管理bean初始化生命周期。
1. 构造bean
1.1方法调用图
构造bean的入口就是beanFactory的getBean()方法,实际调用defaultBeanFactory的getBean()方法。经过层层调用,直到AabstractAutowireCapableBeanFactory中。调用方法图如下:

3-6均在AbstractAutowireCapableBeanFactory完成。
1.2设计到的类图
涉及的类图继承关系如下:

在doCreateBean()中,createBeanInstance返回的是一个BeanWrapper
BeanWrapper提供了设置和获取属性值(单个的或者是批量的),获取属性描述信息、查询只读或者可写属性等功能,用getWrappedInstance()方法就可以得到这个封装的bean的实例。BeanWrapperImpl里面的Object就是BeanWrapper“包裹”的bean,通过getWrappedInstance()方法对外提供。
1.3方法分析
主要分析AbstractAutowireCapableBeanFactory中的方法,其它类中的方法都是对这里方法的封装。
A,BeanWrapper的获取
BeanWrapper提供了设置和获取属性值(单个的或者是批量的),获取属性描述信息、查询只读或者可写属性等功能,用getWrappedInstance()方法就可以得到这个封装的bean的实例。BeanWrapperImpl里面的Object就是BeanWrapper“包裹”的bean,通过getWrappedInstance()方法对外提供。
Spring生命周期概述1
1)设置属性值;
2)调用Bean中的BeanNameAware.setBeanName()方法,如果该Bean实现了BeanNameAware接口;
3)调用Bean中的BeanFactoryAware.setBeanFactory()方法,如果该Bean实现了BeanFactoryAware接口;
4)调用BeanPostProcessors.postProcessBeforeInitialization()方法;
5)调用Bean中的afterPropertiesSet方法,如果该Bean实现了InitializingBean接口;
6)调用Bean中的init-method,通常是在配置bean的时候指定了init-method,例如:<beanclass="beanClass"init-method="init"></bean>
7)调用BeanPostProcessors.postProcessAfterInitialization()方法;
8)如果该Bean是单例的,则当容器销毁并且该Bean实现了DisposableBean接口的时候,调用destory方法;如果该Bean是prototype,则将准备好的Bean提交给调用者,后续不再管理该Bean的生命周期。
initializeBean()方法在AbstractAutowireCapableBeanFactory中,对应Bean生命周期的2-7。initializeBean()在doCreateBean()中调用createBeanInstance()之后。调用了4个方法:
invokeAwareMethods(对应生命周期2、3)
applyBeanPostProcessorsBeforeInitialization(对应生命周期4)
invokeInitMethods(对应生命周期5,6)
applyBeanPostProcessorsAfterInitialization(对应生命周期7)
2.1 invokeAwareMethods
invokeAwareMethods调用bean自省的三个方法(如果该bean实现BeanNameAware接口、BeanClassLoaderAware接口、BeanFactoryAware接口)
2.4 applyBeanPostProcessorsAfterInitialization实现和postProcessBeforeInitialization类似,完成bean初始化后的后置处理。只是在postProcessBeforeInitialization()的for循环中改为:
result =beanProcessor.postProcessAfterInitialization(result, beanName);
3.其它
感觉spring构造bean的和管理bean对象生命周期的实现,比之前spring IoC容器的初始化的过程要简单,也好理解。
4. 参考资料
1. http://sexycoding.iteye.com/blog/1046775:也谈Spring Bean的生命周期
2. 参考书籍《Spring 技术内幕—深入解析Spring架构与设计原理》第二章