Bean生命周期(Spring框架)
外观
概述[编辑 | 编辑源代码]
Bean生命周期是Spring框架中描述一个Bean从创建到销毁的完整过程的核心概念。理解Bean生命周期对于掌握Spring的依赖注入(DI)、AOP以及容器管理机制至关重要。Spring通过回调接口和注解提供了多个扩展点,允许开发者在Bean生命周期的不同阶段插入自定义逻辑。
生命周期阶段[编辑 | 编辑源代码]
Spring Bean的生命周期可分为以下主要阶段(以基于XML的配置为例):
详细阶段说明[编辑 | 编辑源代码]
1. 实例化[编辑 | 编辑源代码]
通过构造器或工厂方法创建Bean实例:
// 等价于 <bean class="com.example.MyBean"/>
public class MyBean {
public MyBean() {
System.out.println("1. 实例化");
}
}
2. 属性赋值[编辑 | 编辑源代码]
Spring通过依赖注入设置属性值:
<bean class="com.example.MyBean">
<property name="message" value="Hello"/>
</bean>
3. Aware接口回调[编辑 | 编辑源代码]
若Bean实现了Aware接口,会依次触发:
public class MyBean implements BeanNameAware {
@Override
public void setBeanName(String name) {
System.out.println("3. BeanNameAware: " + name);
}
}
4. 初始化前处理[编辑 | 编辑源代码]
public class MyPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String name) {
System.out.println("4. BeforeInit: " + name);
return bean;
}
}
5. 初始化阶段[编辑 | 编辑源代码]
按顺序执行三种初始化方式:
- @PostConstruct注解方法
- InitializingBean接口的
afterPropertiesSet()
- XML中定义的
init-method
public class MyBean {
@PostConstruct
public void postConstruct() {
System.out.println("5.1 @PostConstruct");
}
public void customInit() {
System.out.println("5.3 init-method");
}
}
6. 初始化后处理[编辑 | 编辑源代码]
public class MyPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String name) {
System.out.println("6. AfterInit: " + name);
return bean;
}
}
7. 销毁阶段[编辑 | 编辑源代码]
容器关闭时执行销毁操作,顺序与初始化相反:
- @PreDestroy注解方法
- DisposableBean接口的
destroy()
- XML中定义的
destroy-method
完整示例[编辑 | 编辑源代码]
配置类[编辑 | 编辑源代码]
@Configuration
public class AppConfig {
@Bean(initMethod = "customInit", destroyMethod = "customDestroy")
public LifecycleBean lifecycleBean() {
return new LifecycleBean();
}
@Bean
public static MyPostProcessor postProcessor() {
return new MyPostProcessor();
}
}
执行结果[编辑 | 编辑源代码]
1. 实例化 2. 属性赋值 3. BeanNameAware: lifecycleBean 4. BeforeInit: lifecycleBean 5.1 @PostConstruct 5.2 afterPropertiesSet 5.3 init-method 6. AfterInit: lifecycleBean ... [使用阶段] ... @PreDestroy DisposableBean.destroy customDestroy
生命周期扩展机制[编辑 | 编辑源代码]
通过接口[编辑 | 编辑源代码]
接口 | 方法 | 说明 |
---|---|---|
BeanPostProcessor |
postProcessBefore/AfterInitialization |
全局处理器 |
InstantiationAwareBeanPostProcessor |
postProcessBeforeInstantiation |
实例化前干预 |
通过注解[编辑 | 编辑源代码]
@PostConstruct
/@PreDestroy
(JSR-250)@Bean(initMethod/destroyMethod)
实际应用场景[编辑 | 编辑源代码]
案例:数据库连接池初始化
1. @PostConstruct
中建立初始连接
2. @PreDestroy
中关闭所有连接
public class ConnectionPool {
@PostConstruct
public void init() {
// 创建10个初始连接
}
@PreDestroy
public void cleanup() {
// 关闭所有连接
}
}
常见问题[编辑 | 编辑源代码]
数学表示[编辑 | 编辑源代码]
生命周期阶段可形式化为有序集合: 解析失败 (语法错误): {\displaystyle L = \\{Instantiation, Population, AwareCallbacks, PreInit, Init, PostInit, Usage, PreDestroy, Destruction\\} }