Spring支持@PostConstruct和@PreDestroy注解管理Bean生命周期:前者在依赖注入后、使用前执行初始化逻辑,后者在容器关闭时执行销毁逻辑;二者均需方法为public、无参、void返回,且分别对应javax.annotation或jakarta.annotation包。

在 Java 中,Spring 容器管理 Bean 的生命周期时,可以通过注解指定初始化和销毁方法,无需 XML 配置。最常用的是 @PostConstruct 和 @PreDestroy,它们是 JSR-250 标准注解,Spring 原生支持。
用 @PostConstruct 指定初始化逻辑
该注解标注的方法会在依赖注入完成后、Bean 被正式使用前执行一次。它替代了 InitializingBean.afterPropertiesSet() 或 init-method 属性。
- 方法必须是 public,无参数,返回 void
- 一个类中只能有一个方法使用该注解
- 即使有多个 Bean 实例,每个实例都会独立执行一次
示例:
@Component
public class UserService {
@PostConstruct
public void init() {
System.out.println("UserService 初始化完成");
}
}
用 @PreDestroy 指定销毁逻辑
该注解标注的方法会在 Bean 从 Spring 容器中移除前执行,适用于资源清理(如关闭连接、释放锁等)。它替代了 DisposableBean.destroy() 或 destroy-method 属性。
立即学习“Java免费学习笔记(深入)”;
- 方法必须是 public,无参数,返回 void
- 只在单例 Bean 的容器关闭时触发(如调用
context.close()) - 原型(prototype)Bean 不受 Spring 管理销毁过程,此注解无效
示例:
@Component
public class DataSourceManager {
@PreDestroy
public void cleanup() {
System.out.println("释放数据库连接池");
}
}
注意:@PostConstruct 和 @PreDestroy 不是 Spring 自定义注解
它们属于 javax.annotation(Java EE)或 jakarta.annotation(Jakarta EE 9+),因此需要确保依赖中包含对应包:
- Java 8–11 项目:添加
javax.annotation:javax.annotation-api - Spring Boot 3+ / Jakarta EE 9+:使用
jakarta.annotation:jakarta.annotation-api
若缺少依赖,运行时会忽略这些注解,且无报错——容易被忽略,建议检查日志或加断点验证是否执行。
替代方案:@Bean 的 initMethod/destroyMethod 属性
如果不想用注解,也可以在配置类中通过 @Bean 显式指定:
@Configuration
public class AppConfig {
@Bean(initMethod = "init", destroyMethod = "cleanup")
public UserService userService() {
return new UserService();
}
}
此时 init() 和 cleanup() 是普通方法,不要加 @PostConstruct 或 @PreDestroy,否则会被执行两次。


















