创建Bean的步骤在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
的createBean
方法中,具体的顺序如下
- 实例化,具体使用的
BeanUtils.instantiateClass
,内部采用的constructor.newInstance
方法,关于class.newInstance
和constructor.newInstance
的区别,class实例化只能使用默认构造方法,不能使用带参的构造函数。 - 检查依赖,填充属性,具体在
populateBean
方法中,内部使用的是反射的writeMethod.invoke
。这里注意,会在这里提前检查InstantiationAwareBeanPostProcessor
接口,若是实现该接口会调用其postProcessAfterInstantiation
和postProcessPropertyValues
方法。 - 初始化bean,具体在
initializeBean
方法中- 首先判断其是否实现了
BeanNameAware,BeanFactoryAware
等aware,若是实现,调用其set方法。 - 判断当前的factory中是否有
BeanPostProcessor
实现类,若是存在,逐个调用其postProcessBeforeInitialization
方法。 - 若是
PostConstruct
标记的方法存在,执行该方法。这里是使用BeanPostProcessor
来实现的,具体是在org.springframework.context.annotation.CommonAnnotationBeanPostProcessor
。该类在继承InitDestroyAnnotationBeanPostProcessor
时使用setInitAnnotationType
添加了PostConstruct
注解。 - 当前Bean若是实现了
InitializingBean
,调用其afterPropertiesSet
方法。 - 若是存在
init-method
,调用其init-method
。(有些书例如spring in action提到@PostConstruct标记的方法等效于init-method,但是其实两者是不同的并且两者可以同时存在,且调用顺序不同)。 - 判断当前factory是否有
BeanPostProcess
的实现类,若是存在,逐个调用其postProcessAfterInitialization
方法。
- 首先判断其是否实现了
- 当前bean已经可以使用。
- 销毁bean。
- 若是存在
DestructionAwareBeanPostProcessor
的实现类,逐个调用其postProcessBeforeDestruction
方法。 - 若是存在
PreDestroy
标记的方法,执行该方法,和@PostConstructor相同,使用InitDestroyAnnotationBeanPostProcessor
,该类实现了DestructionAwareBeanPostProcessor
的方法。 - 若是当前Bean实现了
DisposableBean
,调用其destroy
方法。 - 若是存在
destroy-method
,调用其destroy-method
方法。
- 若是存在