Java面试题更新 2026-08-03

在 Spring 框架中,@PostConstruct 和 @PreDestroy 这两个注解各自承担什么职责?请分别说明它们的使用场景和触发时机。

考察说明

考察对 Spring 生命周期回调注解的理解,包括作用、使用场景和触发时机。

回答思路

  1. 【回答框架 1】@PostConstruct 是 Java 标准注解,用于在依赖注入完成后执行初始化逻辑,通常用于设置缓存、加载配置等。触发器在 bean 初始化阶段,即构造器执行后、属性填充完成后,且在 init-method 之前调用。
  2. 【回答框架 2】@PreDestroy 是销毁前的回调,在容器关闭或 bean 被移除前执行,常用于释放资源、关闭连接等。触发时机在容器销毁 bean 之前,与 destroy-method 类似但更标准。
  3. 【回答框架 3】两者都只能标注在无参方法上,方法不能有返回值(void),异常抛出会影响生命周期。与 InitializingBean/DisposableBean 接口相比,注解方式更简洁且不侵入代码。
  4. 【回答框架 4】需要注意执行顺序:构造器 -> @PostConstruct -> afterPropertiesSet(如果实现了)-> init-method;销毁时先 @PreDestroy 后 destroy-method。理解顺序有助于排查初始化问题。
  5. 【关键点 1】@PostConstruct 在依赖注入完成后执行,用于初始化逻辑。
  6. 【关键点 2】@PreDestroy 在 bean 销毁前执行,用于资源清理。
  7. 【关键点 3】注解方法必须无参数且返回 void,且每个类只能有一个对应注解。
  8. 【关键点 4】执行顺序:构造器 -> @PostConstruct -> afterPropertiesSet -> init-method;销毁时 @PreDestroy -> destroy-method。
  9. 【关键点 5】注解方式优于接口实现,因为不耦合 Spring API。
  10. 【易错点 1】容易混淆初始化顺序,错误认为 @PostConstruct 在构造器之后立即执行,实际上还需依赖注入。
  11. 【易错点 2】在 @PreDestroy 中调用可能已被销毁的依赖可能引发问题,应避免依赖其他 bean 的状态。
  12. 【易错点 3】对于原型作用域的 bean,Spring 不负责销毁,@PreDestroy 不会触发。