创建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方法。
- 若是存在