Bean 什么时候会被销毁?
文章目录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 会按以下顺序调用你定义的销毁代码PreDestroy注解方法这是 JSR-250 标准注解优先级最高。PreDestroypublicvoidcleanup(){System.out.println(1. 执行 PreDestroy 方法释放资源...);}DisposableBean接口的destroy()方法如果 Bean 实现了这个接口Spring 会调用它。publicclassMyBeanimplementsDisposableBean{Overridepublicvoiddestroy(){System.out.println(2. 执行 DisposableBean.destroy()...);}}3.**自定义的 destroy-method** 在 Bean 注解或XML中指定的销毁方法优先级最低。 java// Java 配置方式Bean(destroyMethodcustomDestroy)publicMyBeanmyBean(){...}// 或者 XML 方式// bean id... class... destroy-methodcustomDestroy /---##4.特殊情况为什么我的销毁方法没执行 如果你发现单例Bean的销毁方法没有被调用通常是以下两个原因***没有优雅关闭容器**如果在非Web应用如普通的 main 方法程序中直接结束运行没有调用 context.close()JVM会直接杀掉进程Spring来不及执行销毁逻辑。建议使用 context.registerShutdownHook()。***Prototype作用域**如前所述Spring根本不会去销毁Prototype类型的Bean。**一句话总结**对于单例**容器关Bean毁**对于多例**Spring管生不管死**。 关于Bean的生命周期你是想进一步了解初始化阶段的具体顺序还是在处理具体的资源释放如数据库连接池、线程池报错问题
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2599120.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!