Spring 中 Bean 的生命周期

一、什么是 Bean 生命周期?

Spring 中的 Bean 生命周期是指一个 Bean 从 被容器创建最终销毁 所经历的一系列过程。

它体现了 Spring IOC 容器在管理 Bean 实例时所执行的各个钩子流程,包括初始化、依赖注入、增强处理、销毁等多个环节。


二、Bean 生命周期完整流程(逻辑顺序)

1. 实例化(Constructor)
2. 属性注入(依赖注入,DI)
3. 感知阶段(Aware 接口)
4. 初始化前处理(BeanPostProcessor#postProcessBeforeInitialization)
5. 初始化(@PostConstruct 或 InitializingBean#afterPropertiesSet)
6. 初始化后处理(BeanPostProcessor#postProcessAfterInitialization)
7. Bean 就绪可用
8. 销毁前处理(@PreDestroy 或 DisposableBean#destroy)

三、生命周期各阶段详细说明


实例化(Instantiation)

  • BeanFactoryApplicationContext 通过 反射调用构造方法 创建 Bean 实例。
  • 此时 Bean 的属性尚未注入。
public class UserService {
    public UserService() {
        System.out.println("构造方法执行:Bean 被实例化");
    }
}

属性注入(依赖注入)

  • Spring 通过反射将依赖的属性注入到实例中。
  • 包括:@Autowired@Value、构造器注入等。

感知接口回调(Aware 接口)

如果 Bean 实现了以下接口,Spring 会注入相关上下文信息:

接口名描述
BeanNameAware获取当前 Bean 的名字
BeanFactoryAware获取当前 BeanFactory 实例
ApplicationContextAware获取当前 ApplicationContext
public class MyBean implements BeanNameAware {
    @Override
    public void setBeanName(String name) {
        System.out.println("BeanNameAware:我的名字是 " + name);
    }
}

初始化前处理(BeanPostProcessor)

  • Spring 提供的扩展点之一;
  • 所有实现了 BeanPostProcessor 接口的类会在每个 Bean 初始化前后被回调。
public Object postProcessBeforeInitialization(Object bean, String beanName);

初始化(核心)

以下三种初始化方式 Spring 均支持:

方式示例
注解方式@PostConstruct(推荐)
接口方式实现 InitializingBean 接口的 afterPropertiesSet() 方法
XML 配置init-method="init"(在 XML 中显式指定)
@PostConstruct
public void init() {
    System.out.println("初始化逻辑执行");
}

初始化后处理(BeanPostProcessor)

  • 允许开发者对 Bean 进行增强(如 AOP 就是基于此);
  • 可以返回原 Bean,也可以返回代理对象。
public Object postProcessAfterInitialization(Object bean, String beanName);

Bean 就绪可用

  • Spring 容器完成了 Bean 的初始化,此时可以被应用程序正常使用;
  • Bean 已经具备所有依赖关系,准备投入业务运行。

销毁阶段(Destruction)

Spring 会在容器关闭时销毁单例 Bean:

销毁方式示例
注解方式@PreDestroy(推荐)
接口方式实现 DisposableBean#destroy()
XML 配置destroy-method="destroy"
@PreDestroy
public void cleanup() {
    System.out.println("Bean 即将销毁,释放资源");
}

注意:默认只销毁单例 Bean,且前提是容器必须正常关闭,如:

((ConfigurableApplicationContext) context).close();

四、完整生命周期流程示意图

构造器实例化 →
属性注入 →
xxxAware 接口 →
postProcessBeforeInitialization →
@PostConstruct / afterPropertiesSet →
postProcessAfterInitialization →
应用使用 →
@PreDestroy / destroy

五、常见问题

Bean 的生命周期中哪个阶段可用于增强?

  • 答:BeanPostProcessor 是关键,它可以包裹原始 Bean,进行代理或包装。

Bean 是什么时候被创建的?

  • 默认是容器启动时(单例 Bean)
  • 如果是 @Lazyprototype,则是 首次使用时

Bean 销毁时会自动释放资源吗?

  • 只会执行自定义的 destroy() 方法或 @PreDestroy
  • 对于像数据库连接、线程池等,需要手动在销毁钩子中关闭资源。

六、总结一

Spring Bean 的生命周期涵盖:创建 → 初始化 → 可用 → 销毁 全流程。通过实现各种接口或使用注解(如 @PostConstruct@PreDestroy),可以在各阶段插入自定义逻辑,方便资源初始化与释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值