在 Spring 框架中,Bean 的生命周期涵盖了从创建到销毁的完整过程。理解这些生命周期方法有助于实现资源初始化、依赖注入后的处理以及资源释放等功能。以下是 Spring Bean 生命周期的关键方法和阶段:
1. 核心生命周期阶段
Spring Bean 的完整生命周期包含以下主要阶段:
- 实例化:通过构造器或工厂方法创建 Bean 实例。
- 属性注入:完成 Bean 的依赖注入(如
@Autowired、@Resource)。 - 初始化回调:执行自定义初始化逻辑(如
@PostConstruct、InitializingBean)。 - Bean 后置处理器:在初始化前后执行额外处理(如 AOP 代理)。
- 使用 Bean:Bean 就绪并可被应用使用。
- 销毁回调:在容器关闭时执行资源释放(如
@PreDestroy、DisposableBean)。
2. 初始化相关方法
2.1 @PostConstruct 注解
JSR-250 规范注解,在依赖注入完成后立即执行。
@Component
public class MyBean {
@PostConstruct
public void init() {
// 初始化逻辑
System.out.println("MyBean 初始化完成");
}
}
2.2 InitializingBean 接口
实现 afterPropertiesSet() 方法,在属性注入后执行。
@Component
public class MyBean implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
// 初始化逻辑
System.out.println("MyBean 属性设置完成,执行初始化");
}
}
2.3 XML 配置中的 init-method
在 XML 配置中指定初始化方法:
<bean id="myBean" class="com.example.MyBean" init-method="customInit"/>
public class MyBean {
public void customInit() {
// 自定义初始化方法
}
}
3. 销毁相关方法
3.1 @PreDestroy 注解
JSR-250 规范注解,在 Bean 销毁前执行。
@Component
public class MyBean {
@PreDestroy
public void cleanup() {
// 资源释放逻辑
System.out.println("MyBean 准备销毁");
}
}
3.2 DisposableBean 接口
实现 destroy() 方法,在 Bean 销毁前执行。
@Component
public class MyBean implements DisposableBean {
@Override
public void destroy() throws Exception {
// 资源释放逻辑
System.out.println("MyBean 执行销毁方法");
}
}
3.3 XML 配置中的 destroy-method
在 XML 配置中指定销毁方法:
<bean id="myBean" class="com.example.MyBean" destroy-method="customDestroy"/>
public class MyBean {
public void customDestroy() {
// 自定义销毁方法
}
}
4. BeanPostProcessor 接口
在 Bean 初始化前后执行额外处理,常用于 AOP 代理或自定义增强。
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 在初始化方法(如 @PostConstruct)之前执行
System.out.println("Before initialization: " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 在初始化方法之后执行
System.out.println("After initialization: " + beanName);
return bean; // 可返回代理对象替换原 Bean
}
}
5. BeanFactoryPostProcessor 接口
在 Bean 定义加载后、实例化前修改 Bean 定义,属于容器级处理器。
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// 修改 Bean 定义
BeanDefinition beanDefinition = beanFactory.getBeanDefinition("myBean");
beanDefinition.setScope(ConfigurableBeanFactory.SCOPE_PROTOTYPE);
}
}
6. 生命周期方法执行顺序
当多种初始化/销毁方法同时存在时,执行顺序如下:
初始化顺序:
- Bean 实例化(构造器)
- 属性注入(
@Autowired等) @PostConstruct注解方法InitializingBean.afterPropertiesSet()- XML 配置的
init-method BeanPostProcessor.postProcessAfterInitialization()
销毁顺序:
@PreDestroy注解方法DisposableBean.destroy()- XML 配置的
destroy-method
7. 示例代码
以下是一个完整示例,演示 Bean 生命周期方法的执行:
@Component
public class MyBean implements InitializingBean, DisposableBean {
private String name;
public MyBean() {
System.out.println("MyBean 构造器被调用");
}
@Autowired
public void setName(String name) {
this.name = name;
System.out.println("注入 name 属性: " + name);
}
@PostConstruct
public void postConstruct() {
System.out.println("@PostConstruct 方法被调用");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean.afterPropertiesSet() 被调用");
}
public void customInit() {
System.out.println("XML 配置的 init-method 被调用");
}
@PreDestroy
public void preDestroy() {
System.out.println("@PreDestroy 方法被调用");
}
@Override
public void destroy() throws Exception {
System.out.println("DisposableBean.destroy() 被调用");
}
public void customDestroy() {
System.out.println("XML 配置的 destroy-method 被调用");
}
}
8. 总结
- 初始化方法:
@PostConstruct→InitializingBean→init-method。 - 销毁方法:
@PreDestroy→DisposableBean→destroy-method。 - 处理器:
BeanFactoryPostProcessor处理 Bean 定义,BeanPostProcessor处理 Bean 实例。 - 最佳实践:优先使用
@PostConstruct和@PreDestroy注解,避免过度实现接口。
通过掌握 Bean 的生命周期方法,可以更好地控制 Bean 的初始化和销毁过程,实现资源的正确管理和应用的优雅退出。
441



被折叠的 条评论
为什么被折叠?



