Java Spring Bean的生命周期与各扩展点的执行顺序
Spring Bean 的生命周期管理是框架的核心功能,主要分为四个阶段:实例化、属性赋值、初始化和销毁。掌握这些阶段及其扩展点的执行顺序,能够帮助开发者在正确的时机介入Bean的创建过程,实现框架级的业务逻辑。
一、 生命周期全景流程图
为了直观展示Bean从创建到销毁的完整过程,以及各个扩展点的切入时机,请参考以下流程图。
graph TD
Start((开始)) --> C1[ApplicationContextInitializer]
C1 --> C2[BeanDefinitionRegistryPostProcessor]
C2 --> C3[BeanFactoryPostProcessor]
C3 --> P1["InstantiationAwareBeanPostProcessor: postProcessBeforeInstantiation"]
P1 --> Inst(实例化 Bean)
Inst --> P2["InstantiationAwareBeanPostProcessor: postProcessAfterInstantiation"]
P2 --> Prop(属性赋值 Populate)
Prop --> Aware[Aware 接口回调]
Aware --> P3["BeanPostProcessor: postProcessBeforeInitialization"]
P3 --> Init1["@PostConstruct"]
Init1 --> Init2[InitializingBean]
Init2 --> Init3["init-method"]
Init3 --> P4["BeanPostProcessor: postProcessAfterInitialization"]
P4 --> Use(Bean 使用阶段)
Use --> R1[SmartInitializingSingleton]
R1 --> R2[ApplicationRunner / CommandLineRunner]
R2 --> D1["@PreDestroy"]
D1 --> D2[DisposableBean]
D2 --> D3["destroy-method"]
D3 --> End((结束))
二、 容器启动与Bean定义阶段
在Bean实例化之前,Spring容器会先完成自身的初始化和Bean定义的加载。这一阶段主要处理容器级别的配置。
- 执行
ApplicationContextInitializer接口的initialize方法。- 此时机在容器刷新之前,用于对上下文进行编程式初始化,如注册属性源。
- 执行
BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法。- 在标准Bean定义加载完成后、但其他Bean实例化前执行,常用于动态注册BeanDefinition。
- 执行
BeanFactoryPostProcessor接口的postProcessBeanFactory方法。- 此时所有Bean定义已加载但未实例化,允许修改Bean定义的元数据(如属性值)。
三、 Bean实例化与属性赋值阶段
此阶段开始创建具体的Bean对象实例。
- 调用
InstantiationAwareBeanPostProcessor接口的postProcessBeforeInstantiation方法。- 在实例化前触发,若返回非空对象可跳过默认实例化流程。
- 执行 构造方法。
- Spring调用构造器(或工厂方法)创建Bean实例。
- 调用
InstantiationAwareBeanPostProcessor接口的postProcessAfterInstantiation方法。- 在实例化后、属性赋值前触发。
- 执行 属性赋值。
- Spring根据配置完成依赖注入(Setter注入或字段注入)。
- 注入 Aware 接口依赖。
- 依次调用
BeanNameAware、BeanFactoryAware、ApplicationContextAware等接口的set方法,将容器资源注入Bean。
- 依次调用
四、 Bean初始化阶段
初始化阶段是生命周期中扩展点最密集的部分,也是AOP代理生成的关键时机。
- 调用
BeanPostProcessor接口的postProcessBeforeInitialization方法。- 初始化前的回调,用于对Bean进行预处理。
- 执行
@PostConstruct注解标记的方法。- JSR-250标准注解,通常用于执行依赖注入后的初始化逻辑。
- 执行
InitializingBean接口的afterPropertiesSet方法。- Spring接口提供的初始化回调。
- 执行 自定义
init-method方法。- 在XML配置或
@Bean注解中指定的初始化方法。
- 在XML配置或
- 调用
BeanPostProcessor接口的postProcessAfterInitialization方法。- 初始化后的回调。注意:Spring AOP的代理对象通常是在这一步通过包装原始对象生成的。
五、 Bean使用与销毁阶段
Bean初始化完成后即可供应用使用,最终在容器关闭时经历销毁流程。
- 触发
SmartInitializingSingleton接口的afterSingletonsInstantiated方法。- 在所有单例Bean初始化完成后触发,确保所有依赖已就绪。
- 运行
ApplicationRunner或CommandLineRunner。- SpringBoot特有扩展点,用于在启动完成后执行业务逻辑。
- 执行
@PreDestroy注解标记的方法。- 容器关闭时触发,用于释放资源。
- 执行
DisposableBean接口的destroy方法。- Spring接口提供的销毁回调。
- 执行 自定义
destroy-method方法。- 在配置中指定的销毁方法。
六、 关键扩展点执行顺序速查
为了方便记忆,以下是初始化和销毁阶段核心机制的执行顺序总结。
| 阶段 | 顺序 | 扩展点/机制 | 说明 |
|---|---|---|---|
| 初始化 | 1 | @PostConstruct |
注解方式,推荐使用 |
| 2 | InitializingBean |
接口方式 afterPropertiesSet() |
|
| 3 | init-method |
XML或注解配置的自定义方法 | |
| 销毁 | 1 | @PreDestroy |
注解方式,推荐使用 |
| 2 | DisposableBean |
接口方式 destroy() |
|
| 3 | destroy-method |
XML或注解配置的自定义方法 |

暂无评论,快来抢沙发吧!