@postconstruct 和 @predestroy 是 jsr-250 标准注解,用于无侵入式生命周期管理:@postconstruct 在依赖注入完成后、bean 放入容器前执行一次,适合初始化;@predestroy 在 bean 销毁前调用,用于资源清理,二者均要求方法无参、void 返回、非静态,且仅对 spring 管理的 bean 有效。

@PostConstruct 和 @PreDestroy 是标准生命周期钩子,不依赖 Spring 接口,但需确保 Bean 由 Spring 容器管理,且注解方法签名合规。
@PostConstruct:初始化阶段执行一次
它在构造完成、所有依赖(@Autowired / @Resource)注入完毕后、Bean 放入容器前触发。适合做连接建立、缓存预热、参数校验等准备动作。
- 方法必须无参、返回 void,可为 public/protected/package-private/private,但不能是 static
- 一个类里只能有一个 @PostConstruct 方法,否则启动报错
- 即使 Bean 是 prototype 作用域,每次 new 实例时也会执行
- 若构造函数抛异常,该方法不会执行;若它自己抛异常,整个 Bean 创建失败
@PreDestroy:销毁前释放资源
它在 Bean 被销毁前调用,适用于单例 Bean 的容器关闭时,或显式调用 ConfigurableApplicationContext.close() 时。prototype Bean 默认不被容器自动销毁,需手动触发才能运行此方法。
- 同样要求无参、void 返回、非静态
- 仅对 Spring 管理生命周期的 Bean 有效(如 singleton,或通过 registerDisposableBean 显式注册的 prototype)
- 进程被 kill -9 强制终止时,该方法通常不会执行
- 建议只做轻量级清理,比如 close() 连接、shutdown() 线程池,避免阻塞销毁流程
使用前提与常见配置
Spring 5.x 默认启用 JSR-250 支持,无需额外配置;Spring 6+ 需引入 jakarta.annotation-api 依赖(而非 javax.annotation-api)。
- 注解类需位于组件扫描路径下(如加 @Component、@Service),或通过 @Bean 注册
- 方法名任意,但推荐语义化命名(如 init()、destroy()、startUp()、shutDown())
- 避免在 @PostConstruct 中发起远程调用或耗时 I/O,以防拖慢启动或导致失败









