Spring Boot不调用DisposableBean.destroy()方法的问题咨询
原因分析
- 终止进程的方式不符合优雅停机要求:Spring 容器的Bean销毁逻辑仅在优雅停机流程中触发。如果通过IDE的强制停止按钮(通常发送SIGKILL信号)、直接关闭运行终端、任务管理器强制结束进程等方式停止应用,Spring 上下文没有执行销毁流程的时间,不会调用
destroy方法。 - Bean作用域问题:如果Bean的scope设置为原型(prototype),Spring 容器仅负责实例化和初始化该类型Bean,不会管理其完整生命周期,不会主动调用销毁方法。你当前使用
@Component默认是单例scope,该场景可以直接排除。
验证方案
方式1:使用Actuator端点触发优雅停机
- 引入
spring-boot-starter-actuator依赖 - 在application配置文件中添加如下配置:
# 开启shutdown端点 management.endpoint.shutdown.enabled=true # 暴露shutdown端点到web management.endpoints.web.exposure.include=shutdown
- 应用启动后,向
/actuator/shutdown接口发送POST请求触发优雅停机,即可看到destroy方法的日志输出。
方式2:命令行触发停机
将项目打包为jar包后,执行java -jar xxx.jar命令启动应用,随后按下Ctrl + C触发进程终止,正常情况下会打印destroy方法的日志。
补充说明
除了实现DisposableBean接口,你也可以通过@PreDestroy注解声明销毁方法,两者的触发时机和效果完全一致,无需额外配置。
内容的提问来源于stack exchange,提问作者hurelhuyag
相关产品推荐
相关产品推荐

