首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >spring bean生命周期

spring bean生命周期

原创
作者头像
RookieCyliner
发布2025-08-28 13:14:47
发布2025-08-28 13:14:47
2360
举报
文章被收录于专栏:javajava

一、为了更直观地理解这一复杂过程,下图完整地展示了Spring Bean生命周期的所有关键阶段与扩展点:

spring bean生命周期
spring bean生命周期

二、详细阶段说明

让我们对图中的每一个关键步骤进行详细说明。

1. 实例化 (Instantiation)

容器首先通过反射调用Bean的构造函数来创建对象实例。此时只是一个空的对象,属性均为默认值。

相当于MyBean bean = new MyBean();

2. 依赖注入 (Population of Properties)

容器解析Bean的依赖关系(通过 @Autowired, @Value, XML中的 <property> 等配置),并将所需的依赖(其他Bean、基本值、集合等)注入到对象的属性中

相当于bean.setDependency(someOtherBean);

3. & 5. BeanPostProcessor 处理

这是Spring框架中极其强大的扩展点。BeanPostProcessor是一个接口,容器中所有实现了它的Bean都会在每个其他Bean的初始化前后被调用。

  • postProcessBeforeInitialization():在初始化阶段开始之前(即下图第4步之前)执行。允许对Bean进行修改或包装。
    • 常见应用:Spring AOP的代理对象就是在此处生成的(通过 AbstractAutoProxyCreator)。
  • postProcessAfterInitialization():在初始化阶段结束之后(即下图第4步之后)执行。此时Bean已初始化完毕,可以进行最终的修饰。
    • 常见应用:一些后续处理、监控代码的植入。
4. 初始化 (Initialization)

这是Bean生命中最关键的配置阶段,按固定顺序执行以下步骤: a. Aware接口注入 (4.1) 如果Bean实现了各种Aware接口,容器会回调相应的方法,将一些基础设施对象注入给Bean。

  • BeanNameAwaresetBeanName(String name)(获取自身的Bean ID/name)
  • BeanFactoryAwaresetBeanFactory(BeanFactory beanFactory)(获取BeanFactory容器)
  • ApplicationContextAwaresetApplicationContext(ApplicationContext applicationContext)(获取ApplicationContext容器,功能最全)
  • EnvironmentAware, ResourceLoaderAware 等。

b. @PostConstruct 注解 (4.2) 容器会调用被@PostConstruct标注的方法。这是Java EE规范的标准注解,推荐使用,用于执行一些自定义的初始化逻辑。

c. InitializingBean 接口 (4.3) 如果Bean实现了InitializingBean接口,容器会调用其afterPropertiesSet()方法。效果与@PostConstruct类似,但这是Spring特有的接口,将代码与Spring API耦合,不推荐使用

d. 自定义初始化方法 (4.4) 调用在Bean定义中通过@Bean(initMethod = "myInit")或XML中init-method="myInit"指定的自定义初始化方法。这是一种外部配置的初始化方式,无代码侵入性

初始化顺序总结Aware接口 -> @PostConstruct -> InitializingBean -> 自定义init-method

6. 使用 (Ready for Use)

此时,Bean已经完全创建、配置并初始化完毕,驻留在容器中(通常是单例池),等待应用程序的使用(例如被其他Bean依赖或通过context.getBean()获取)。

8. 销毁 (Destruction)

当容器被关闭时(例如调用ApplicationContextclose()方法),所有单例Bean会进入销毁阶段,执行顺序与初始化类似,但相反a. @PreDestroy 注解 (8.1) 容器会调用被@PreDestroy标注的方法。这是Java EE规范的标准注解,推荐使用,用于释放资源(如关闭连接、清理线程池)。

b. DisposableBean 接口 (8.2) 如果Bean实现了DisposableBean接口,容器会调用其destroy()方法。同样,不推荐使用,因为会将代码与Spring API耦合。

c. 自定义销毁方法 (8.3) 调用在Bean定义中通过@Bean(destroyMethod = "myDestroy")或XML中destroy-method="myDestroy"指定的自定义销毁方法。

重要提示原型(prototype)作用域的Bean,容器只负责创建、配置和初始化(到第6步)。不会管理其销毁!生命周期到第6步就结束了,销毁逻辑需要由创建它的客户端自己负责调用。


三、代码示例

代码语言:javascript
复制
@Component
public class ExampleBean implements ApplicationContextAware, InitializingBean, DisposableBean {

    @Autowired
    private AnotherBean anotherBean; // 依赖注入

    public ExampleBean() {
        System.out.println("1. 构造函数执行 - 实例化");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        System.out.println("4.1. Aware接口注入: 获取到ApplicationContext");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("4.2. @PostConstruct方法执行");
    }

    @Override
    public void afterPropertiesSet() {
        System.out.println("4.3. InitializingBean的afterPropertiesSet()执行");
    }

    public void customInit() {
        System.out.println("4.4. 自定义init-method执行");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("8.1. @PreDestroy方法执行");
    }

    @Override
    public void destroy() {
        System.out.println("8.2. DisposableBean的destroy()执行");
    }

    public void customDestroy() {
        System.out.println("8.3. 自定义destroy-method执行");
    }
}

// 配置类
@Configuration
public class AppConfig {
    @Bean(initMethod = "customInit", destroyMethod = "customDestroy")
    public ExampleBean exampleBean() {
        return new ExampleBean();
    }
}

四、总结

Spring Bean的生命周期是一个高度可定制的过程,其核心可以概括为:

  • 创建与注入:实例化 -> 依赖注入。
  • 初始化Aware接口 -> @PostConstruct -> InitializingBean -> init-method,前后被BeanPostProcessor包裹。
  • 销毁@PreDestroy -> DisposableBean -> destroy-method

BeanPostProcessor 是贯穿始终的最强大的扩展点,Spring自身的很多高级功能(如AOP、事务、异步等)都是通过它来实现的。理解这些阶段和扩展点,能够让你更深入地理解Spring的运作原理,并有能力解决更复杂的问题。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、为了更直观地理解这一复杂过程,下图完整地展示了Spring Bean生命周期的所有关键阶段与扩展点:
  • 二、详细阶段说明
    • 1. 实例化 (Instantiation)
    • 2. 依赖注入 (Population of Properties)
    • 3. & 5. BeanPostProcessor 处理
    • 4. 初始化 (Initialization)
    • 6. 使用 (Ready for Use)
    • 8. 销毁 (Destruction)
  • 三、代码示例
  • 四、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档