前言
在了解Spring Bean生命周期时,首先要确立流程骨架,即其只有四个阶段!
- 实例化 Instantiation
- 属性赋值 Populate
- 初始化 Initialization
- 销毁 Destruction
即** 实例化 → 属性赋值 → 初始化 → 销毁**
实例化和属性赋值对应构造方法和setter方法的注入,初始化和销毁是用户能自定义扩展的两个阶段。这四阶段中穿插各种扩展点组成完整的SpringBean生命周期。
源码分析(简化版)
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
BeanWrapper instanceWrapper = null;
if (instanceWrapper == null) {
// 实例化阶段
instanceWrapper = this.createBeanInstance(beanName, mbd, args);
}
Object bean = instanceWrapper.getWrappedInstance();
Object exposedObject = bean;
try {
// 属性赋值阶段
this.populateBean(beanName, mbd, instanceWrapper);
// 初始化阶段
exposedObject = this.initializeBean(beanName, exposedObject, mbd);
}
常用扩展点
影响多个Bean的接口
实现了这些接口的Bean会切入到多个Bean的生命周期中。正因为如此,这些接口的功能非常强大,Spring内部扩展也经常使用这些接口,例如自动注入以及AOP的实现都和他们有关。
- InstantiationAwareBeanPostProcessor
- BeanPostProcessor
这两个接口可能是Spring扩展中最重要的两个接口!前者作用于实例化阶段的前后,后者作用于初始化阶段的前后。正好和第一、第三个生命周期阶段对应。通过图能更好理解:
