文章目录

Java Spring Bean的生命周期与各扩展点的执行顺序

发布于 2026-04-24 09:16:52 · 浏览 9 次 · 评论 0 条

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定义的加载。这一阶段主要处理容器级别的配置。

  1. 执行 ApplicationContextInitializer 接口的 initialize 方法。
    • 此时机在容器刷新之前,用于对上下文进行编程式初始化,如注册属性源。
  2. 执行 BeanDefinitionRegistryPostProcessor 接口的 postProcessBeanDefinitionRegistry 方法。
    • 在标准Bean定义加载完成后、但其他Bean实例化前执行,常用于动态注册BeanDefinition。
  3. 执行 BeanFactoryPostProcessor 接口的 postProcessBeanFactory 方法。
    • 此时所有Bean定义已加载但未实例化,允许修改Bean定义的元数据(如属性值)。

三、 Bean实例化与属性赋值阶段

此阶段开始创建具体的Bean对象实例。

  1. 调用 InstantiationAwareBeanPostProcessor 接口的 postProcessBeforeInstantiation 方法。
    • 在实例化前触发,若返回非空对象可跳过默认实例化流程。
  2. 执行 构造方法。
    • Spring调用构造器(或工厂方法)创建Bean实例。
  3. 调用 InstantiationAwareBeanPostProcessor 接口的 postProcessAfterInstantiation 方法。
    • 在实例化后、属性赋值前触发。
  4. 执行 属性赋值。
    • Spring根据配置完成依赖注入(Setter注入或字段注入)。
  5. 注入 Aware 接口依赖。
    • 依次调用 BeanNameAwareBeanFactoryAwareApplicationContextAware 等接口的 set 方法,将容器资源注入Bean。

四、 Bean初始化阶段

初始化阶段是生命周期中扩展点最密集的部分,也是AOP代理生成的关键时机。

  1. 调用 BeanPostProcessor 接口的 postProcessBeforeInitialization 方法。
    • 初始化前的回调,用于对Bean进行预处理。
  2. 执行 @PostConstruct 注解标记的方法。
    • JSR-250标准注解,通常用于执行依赖注入后的初始化逻辑。
  3. 执行 InitializingBean 接口的 afterPropertiesSet 方法。
    • Spring接口提供的初始化回调。
  4. 执行 自定义 init-method 方法。
    • 在XML配置或 @Bean 注解中指定的初始化方法。
  5. 调用 BeanPostProcessor 接口的 postProcessAfterInitialization 方法。
    • 初始化后的回调。注意:Spring AOP的代理对象通常是在这一步通过包装原始对象生成的。

五、 Bean使用与销毁阶段

Bean初始化完成后即可供应用使用,最终在容器关闭时经历销毁流程。

  1. 触发 SmartInitializingSingleton 接口的 afterSingletonsInstantiated 方法。
    • 在所有单例Bean初始化完成后触发,确保所有依赖已就绪。
  2. 运行 ApplicationRunnerCommandLineRunner
    • SpringBoot特有扩展点,用于在启动完成后执行业务逻辑。
  3. 执行 @PreDestroy 注解标记的方法。
    • 容器关闭时触发,用于释放资源。
  4. 执行 DisposableBean 接口的 destroy 方法。
    • Spring接口提供的销毁回调。
  5. 执行 自定义 destroy-method 方法。
    • 在配置中指定的销毁方法。

六、 关键扩展点执行顺序速查

为了方便记忆,以下是初始化和销毁阶段核心机制的执行顺序总结。

阶段 顺序 扩展点/机制 说明
初始化 1 @PostConstruct 注解方式,推荐使用
2 InitializingBean 接口方式 afterPropertiesSet()
3 init-method XML或注解配置的自定义方法
销毁 1 @PreDestroy 注解方式,推荐使用
2 DisposableBean 接口方式 destroy()
3 destroy-method XML或注解配置的自定义方法

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文