bean生命周期

Spring Bean的生命周期是一个复杂但设计精妙的过程,主要分为四个核心阶段:**实例化 → 属性赋值 → 初始化 → 销毁**。每个阶段都涉及多个关键步骤和扩展点,以下是详细的解析:
---
## 一、实例化(Instantiation)
**目标**:创建Bean的原始对象(尚未填充属性和初始化)。
### 主要操作:
1. **Bean定义定位与加载**:
- 读取配置文件(XML)或扫描注解(如`@Component`),将Bean定义注册到`BeanDefinitionRegistry`。
2. **依赖解析**:
- 检查`depends-on`属性,优先实例化依赖的Bean。
3. **选择实例化策略**:
- **工厂方法**:通过`factory-method`创建。
- **构造器注入**:根据参数选择匹配的构造函数(可能触发循环依赖异常)。
- **Supplier接口**:Spring 5.0+ 通过`Supplier`回调创建。
4. **提前暴露引用(解决循环依赖)**:
- 单例Bean在实例化后,可能提前将原始对象(未初始化)放入三级缓存(`singletonFactories`)。
---
## 二、属性赋值(Population)
**目标**:为Bean注入依赖的属性值。
### 主要操作:
1. **依赖注入(DI)**:
- **字段注入**:通过`@Autowired`、`@Resource`等注解注入。
- **Setter注入**:调用Setter方法。
- **构造器注入**:在实例化阶段已完成。
2. **`Aware`接口回调(部分)**:
- 如果实现了`BeanNameAware`、`BeanClassLoaderAware`、`BeanFactoryAware`,会在此阶段调用对应方法。
3. **应用`BeanPostProcessor`前置处理**:
- 调用`InstantiationAwareBeanPostProcessor.postProcessProperties()`(Spring 5.1+)或 `postProcessPropertyValues()`(旧版)对属性进行自定义修改。
4. **检查并解析依赖**:
- 如果是引用类型(其他Bean),触发依赖Bean的创建;如果是简单类型,直接赋值。
---
## 三、初始化(Initialization)
**目标**:完成所有初始化操作,使Bean可用。
### 主要操作:
1. **`Aware`接口回调(剩余部分)**:
- 如`ApplicationContextAware`、`EnvironmentAware`等(注:`BeanNameAware`等已在属性赋值阶段调用)。
2. **`BeanPostProcessor`前置处理**:
- 调用`BeanPostProcessor.postProcessBeforeInitialization()`,可对Bean进行自定义修改(如代理包装)。
- *典型应用*:`@PostConstruct`注解的处理(通过`CommonAnnotationBeanPostProcessor`)。
3. **调用初始化方法**:
- **`InitializingBean`接口**:执行`afterPropertiesSet()`方法。
- **自定义初始化方法**:通过`init-method`(XML)或`@Bean(initMethod = "...")`指定。
4. **`BeanPostProcessor`后置处理**:
- 调用`BeanPostProcessor.postProcessAfterInitialization()`,常用于AOP代理生成。
- *典型应用*:Spring AOP通过`AbstractAutoProxyCreator`在此阶段创建代理对象。
5. **注册销毁回调**:
- 如果实现了`DisposableBean`或定义了`destroy-method`,注册相关回调方法以便容器销毁时调用。
---
## 四、销毁(Destruction)
**目标**:在容器关闭时安全释放资源。
### 主要操作:
1. **容器关闭触发**:
- 调用`ApplicationContext.close()`或注册JVM关闭钩子。
2. **调用销毁回调**:
- **`DisposableBean`接口**:执行`destroy()`方法。
- **自定义销毁方法**:通过`destroy-method`(XML)或`@Bean(destroyMethod = "...")`指定。
3. **释放资源**:
- 关闭数据库连接、释放文件句柄等清理操作。
4. **从容器移除**:
- Bean实例被垃圾回收(如果无其他引用)。
---
## 📌 完整流程图(简化版)
```
1. 实例化
↓
2. 属性赋值
├── 依赖注入
├── Aware接口回调(部分)
└── BeanPostProcessor.postProcessProperties()
↓
3. 初始化
├── Aware接口回调(剩余)
├── BeanPostProcessor.postProcessBeforeInitialization()
├── @PostConstruct
├── InitializingBean.afterPropertiesSet()
├── init-method
└── BeanPostProcessor.postProcessAfterInitialization()
↓
4. 使用期(Ready)
↓
5. 销毁
├── @PreDestroy
├── DisposableBean.destroy()
└── destroy-method
```
---
## 🔧 关键扩展点总结
| 阶段 | 扩展接口/注解 | 执行时机 |
|------|--------------|----------|
| 实例化后 | `InstantiationAwareBeanPostProcessor` | 实例化后、属性注入前 |
| 属性赋值 | `BeanNameAware`等 | 属性注入期间 |
| 初始化前 | `BeanPostProcessor.postProcessBeforeInitialization()` | 初始化方法前 |
| 初始化 | `@PostConstruct`、`InitializingBean`、`init-method` | 依次执行 |
| 初始化后 | `BeanPostProcessor.postProcessAfterInitialization()` | 初始化方法后 |
| 销毁前 | `@PreDestroy` | 容器关闭前 |
| 销毁 | `DisposableBean`、`destroy-method` | 容器关闭时 |
---
## 💡 注意事项
1. **循环依赖**:仅支持单例Bean通过setter/字段注入的循环依赖,构造器注入会抛异常。
2. **作用域影响**:原型Bean(prototype)的生命周期只到初始化结束,容器不管理其销毁。
3. **执行顺序**:相同类型的扩展接口按优先级(`Ordered`接口或`@Order`)执行。
理解这些阶段和扩展点,能帮助你更好地掌握Spring Bean的管理机制,并灵活定制Bean的创建过程。

浙公网安备 33010602011771号