Spring中@PreDestroy、destroyMethod与DisposableBean.destroy()的执行问题
Spring Bean销毁回调的常见方式与疑问解答
一、Bean销毁回调的三种定义方式
1. 使用@PreDestroy注解
直接在Bean的方法上标注该注解,Spring会在Bean销毁前自动调用此方法:
@Component public class Bean1 { @PreDestroy public void destroy() { System.out.println( "Callback triggered - @PreDestroy."); } }
2. 使用@Bean的destroyMethod属性
在配置类的@Bean注解中指定销毁方法名,对应的Bean类实现该方法即可:
Bean类实现:
public class Bean3 { public void destroy() { System.out.println( "Callback triggered - bean destroy method."); } }
配置类声明:
@Configuration public class ShutdownHookConfiguration { @Bean(destroyMethod = "destroy") public Bean3 initializeBean3() { return new Bean3(); } }
3. 实现DisposableBean接口
让Bean实现该接口并覆写destroy()方法,Spring会在销毁Bean时调用此方法:
@Component public class Bean2 implements DisposableBean { @Override public void destroy() throws Exception { System.out.println( "Callback triggered - DisposableBean."); } }
二、常见疑问解答
1. 除显式调用context.close()外,销毁回调还会在哪些场景触发?
你的猜测是正确的,Spring确实会通过Runtime.getRuntime().addShutdownHook()注册JVM关闭钩子,以下场景都会触发销毁回调:
- JVM正常退出(比如执行完main方法、调用
System.exit()); - 应用容器(如Tomcat、Jetty)正常停止;
- Web应用被卸载时(Servlet上下文销毁);
- Spring应用上下文被垃圾回收时(此场景极少出现,通常上下文会被持有引用)。
2. Spring是否保证三种销毁回调的执行顺序?
Spring有明确的固定执行顺序,如果同一个Bean同时配置了三种销毁方式,执行顺序为:
@PreDestroy注解标注的方法;DisposableBean接口的destroy()方法;@Bean中destroyMethod指定的方法。
这个顺序是Spring容器内部的既定逻辑,确保注解式回调优先执行,再处理接口实现,最后执行自定义销毁方法,让依赖逻辑的执行顺序可控。
内容的提问来源于stack exchange,提问作者Sergey Zolotarev
相关产品推荐
相关产品推荐

