01.2 — Bean 生命周期
定位: 从 BeanDefinition 到销毁——Spring Bean 的完整生命周期 面试高频度: ⭐⭐⭐⭐⭐ 考查方式: 生命周期各阶段、AOP 代理生成时机、扩展点
一、这是什么?为什么需要它?
Bean 生命周期定义了 Spring 如何管理一个 Bean 从创建到销毁的全过程。理解生命周期是理解 Spring AOP、事务、@PostConstruct 等机制的基础。
二、原理拆解
Bean 生命周期 8 阶段
- 实例化:通过反射创建 Bean 原始实例,此时依赖尚未注入
- 属性赋值:填充 @Autowired、@Value、@Resource 等标注的字段/方法
- Aware 回调:让 Bean 获取容器基础设施(BeanName、BeanFactory、ApplicationContext 等)
- BeanPostProcessor#postProcessBeforeInitialization:前置处理
- 初始化:@PostConstruct -> InitializingBean.afterPropertiesSet() -> 自定义 init-method
- BeanPostProcessor#postProcessAfterInitialization:后置处理,AOP 动态代理在此生成(重要!)
- Bean 就绪:可供使用
- 销毁:@PreDestroy -> DisposableBean.destroy() -> 自定义 destroy-method
生命周期流程图
三、关键点详解
| 阶段 | 关键动作 | 扩展点 |
|---|---|---|
| 实例化 | 构造函数推断、反射创建 | 无参构造 / @Autowired 构造 |
| 属性赋值 | 填充 @Autowired/@Value | 字段注入、Setter 注入 |
| Aware 回调 | 注入容器基础设施(BeanName、BeanFactory、ApplicationContext) | setBeanName()、setBeanFactory() |
| 前置处理 | postProcessBeforeInitialization | 自定义 BeanPostProcessor |
| 初始化 | @PostConstruct -> InitializingBean -> init-method | @PostConstruct、InitializingBean |
| 后置处理 | AOP 代理在此生成 | AbstractAutoProxyCreator |
| 销毁 | @PreDestroy -> DisposableBean -> destroy-method | @PreDestroy、DisposableBean |
四、实战验证
java
@Component
public class LifecycleBean implements InitializingBean, DisposableBean {
public LifecycleBean() {
System.out.println("1. 实例化");
}
@Autowired
private SomeDependency dependency;
@PostConstruct
public void postConstruct() {
System.out.println("2. @PostConstruct 初始化");
}
@Override
public void afterPropertiesSet() {
System.out.println("3. InitializingBean.afterPropertiesSet");
}
@Override
public void destroy() {
System.out.println("4. 销毁");
}
}
// 启动时输出顺序:
// 1. 实例化 -> 2. @PostConstruct -> 3. afterPropertiesSet五、面试视角
| 追问 | 答案要点 |
|---|---|
| AOP 代理在哪个阶段生成? | postProcessAfterInitialization(后置处理) |
| @PostConstruct 和 afterPropertiesSet 执行顺序? | @PostConstruct 先执行,然后 InitializingBean |
| 如何在 Bean 初始化前后加入自定义逻辑? | 实现 BeanPostProcessor 接口 |
| aware 接口的作用? | 让 Bean 获取容器基础设施(BeanName、BeanFactory 等) |
📚 相关链接
- **IoC与DI原理** — 依赖注入在生命周期第 2 阶段
- **AOP 板块** — AOP 代理在 postProcessAfterInitialization 生成
- ← 返回 **返回 IoC 容器索引**