You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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同时配置了三种销毁方式,执行顺序为:

  1. @PreDestroy注解标注的方法;
  2. DisposableBean接口的destroy()方法;
  3. @Bean中destroyMethod指定的方法。

这个顺序是Spring容器内部的既定逻辑,确保注解式回调优先执行,再处理接口实现,最后执行自定义销毁方法,让依赖逻辑的执行顺序可控。

内容的提问来源于stack exchange,提问作者Sergey Zolotarev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:07:52