Bean 什么时候会被销毁?
2026/5/10 1:02:40 网站建设 项目流程

文章目录

    • 1. 核心触发时机:容器关闭
    • 2. 不同作用域(Scope)的差异
    • 3. 销毁逻辑的具体执行顺序

Bean 的销毁时机主要取决于它的作用域(Scope)以及容器(ApplicationContext)的状态

在 Spring 中,Bean 的销毁过程遵循严格的生命周期管理。以下是具体的触发条件和执行逻辑:


1. 核心触发时机:容器关闭

对于最常见的Singleton(单例)Bean,其生命周期与 Spring 容器同步。

  • 触发动作:当调用ConfigurableApplicationContext.close()方法,或者 JVM 接收到关闭信号(通过注册的Shutdown Hook)时。
  • 执行过程:容器在关闭前,会找出所有实现了销毁接口或定义了销毁方法的单例 Bean,并逐一执行它们的销毁逻辑。

2. 不同作用域(Scope)的差异

不同作用域的 Bean,销毁时机完全不同:

作用域 (Scope)销毁时机说明
Singleton容器关闭时在容器整个生命周期内只创建一次,随容器一起“寿终正寝”。
PrototypeSpring 不负责销毁关键点:Spring 只负责创建并初始化多例 Bean,一旦交给客户端,容器就不再维护它的引用。销毁工作必须由开发者手动完成(如通过垃圾回收或手动调用方法)。
RequestHTTP 请求结束时随当前 HTTP 请求的完成而销毁。
SessionHTTP Session 结束时当会话超时或被手动失效(Invalidate)时销毁。

3. 销毁逻辑的具体执行顺序

当销毁时机到达时,Spring 会按以下顺序调用你定义的销毁代码:

  1. @PreDestroy注解方法
    这是 JSR-250 标准注解,优先级最高。
@PreDestroypublicvoidcleanup(){System.out.println("1. 执行 @PreDestroy 方法,释放资源...");}
  1. DisposableBean接口的destroy()方法
    如果 Bean 实现了这个接口,Spring 会调用它。
publicclassMyBeanimplementsDisposableBean{@Overridepublicvoiddestroy(){System.out.println("2. 执行 DisposableBean.destroy()...");}}```3.**自定义的 `destroy-method`**: 在 `@Bean` 注解或XML中指定的销毁方法,优先级最低。 ```java// Java 配置方式@Bean(destroyMethod="customDestroy")publicMyBeanmyBean(){...}// 或者 XML 方式// <bean id="..." class="..." destroy-method="customDestroy" />```---##4.特殊情况:为什么我的销毁方法没执行? 如果你发现单例Bean的销毁方法没有被调用,通常是以下两个原因:***没有优雅关闭容器**:如果在非Web应用(如普通的 `main` 方法程序)中直接结束运行,没有调用 `context.close()`,JVM会直接杀掉进程,Spring来不及执行销毁逻辑。建议使用 `context.registerShutdownHook()`。***Prototype作用域**:如前所述,Spring根本不会去销毁Prototype类型的Bean**一句话总结:**对于单例,**容器关,Bean**;对于多例,**Spring管生不管死**。 关于Bean的生命周期,你是想进一步了解初始化阶段的具体顺序,还是在处理具体的资源释放(如数据库连接池、线程池)报错问题?

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询