一、什么是 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)
- 由
BeanFactory
或ApplicationContext
通过 反射调用构造方法 创建 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 {@Overridepublic 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);
- 如果是
@Lazy
或prototype
,则是 首次使用时。
Bean 销毁时会自动释放资源吗?
- 只会执行自定义的
destroy()
方法或@PreDestroy
; - 对于像数据库连接、线程池等,需要手动在销毁钩子中关闭资源。
六、总结一
Spring Bean 的生命周期涵盖:创建 → 初始化 → 可用 → 销毁 全流程。通过实现各种接口或使用注解(如
@PostConstruct
、@PreDestroy
),可以在各阶段插入自定义逻辑,方便资源初始化与释放。