Spring Bean 控制销毁顺序的方法总结

控制Spring Bean销毁顺序的方法

在Spring框架中,有几种方法可以控制Bean的销毁顺序。以下是主要的几种方式及其示例代码:

1. 实现DisposableBean接口

实现DisposableBean接口并重写destroy()方法,Spring会按照依赖关系的相反顺序调用这些方法。

import org.springframework.beans.factory.DisposableBean;public class BeanA implements DisposableBean {@Overridepublic void destroy() throws Exception {System.out.println("Destroying BeanA");}
}public class BeanB implements DisposableBean {@Overridepublic void destroy() throws Exception {System.out.println("Destroying BeanB");}
}

2. 使用@PreDestroy注解

在方法上使用@PreDestroy注解,Spring会在Bean销毁前调用该方法。

import javax.annotation.PreDestroy;public class BeanA {@PreDestroypublic void cleanup() {System.out.println("Cleaning up BeanA");}
}public class BeanB {@PreDestroypublic void cleanup() {System.out.println("Cleaning up BeanB");}
}

3. 指定@DependsOn注解

使用@DependsOn注解可以显式指定Bean的依赖关系,从而影响销毁顺序。

import org.springframework.context.annotation.DependsOn;@DependsOn("beanB")
public class BeanA {@PreDestroypublic void cleanup() {System.out.println("Cleaning up BeanA (depends on BeanB)");}
}public class BeanB {@PreDestroypublic void cleanup() {System.out.println("Cleaning up BeanB");}
}

4. 配置destroy-method属性

在XML配置或Java配置中指定destroy方法。

XML配置示例

<bean id="beanA" class="com.example.BeanA" destroy-method="customDestroy"/>
<bean id="beanB" class="com.example.BeanB" destroy-method="customDestroy"/>

Java配置示例

@Configuration
public class AppConfig {@Bean(destroyMethod = "customDestroy")public BeanA beanA() {return new BeanA();}@Bean(destroyMethod = "customDestroy")public BeanB beanB() {return new BeanB();}
}

5. 使用SmartLifecycle接口

实现SmartLifecycle接口可以更精细地控制启动和关闭顺序。

import org.springframework.context.SmartLifecycle;public class BeanA implements SmartLifecycle {private boolean running = false;@Overridepublic void start() {running = true;}@Overridepublic void stop() {System.out.println("Stopping BeanA");running = false;}@Overridepublic boolean isRunning() {return running;}@Overridepublic int getPhase() {return 1;  // 较高的phase值表示更晚启动,更早关闭}
}public class BeanB implements SmartLifecycle {private boolean running = false;@Overridepublic void start() {running = true;}@Overridepublic void stop() {System.out.println("Stopping BeanB");running = false;}@Overridepublic boolean isRunning() {return running;}@Overridepublic int getPhase() {return 0;  // 较低的phase值表示更早启动,更晚关闭}
}

6. 使用@Order注解

@Order注解可以影响某些特定场景下的Bean处理顺序,但不保证在所有情况下都能控制销毁顺序。

import org.springframework.core.annotation.Order;@Order(1)
public class BeanA {@PreDestroypublic void cleanup() {System.out.println("Cleaning up BeanA (Order 1)");}
}@Order(2)
public class BeanB {@PreDestroypublic void cleanup() {System.out.println("Cleaning up BeanB (Order 2)");}
}

最佳实践建议

  1. 对于简单的销毁逻辑,推荐使用@PreDestroy注解
  2. 对于复杂的生命周期管理,考虑使用SmartLifecycle接口
  3. 明确依赖关系时使用@DependsOn
  4. 注意:销毁顺序通常是创建顺序的逆序,除非有明确的依赖关系

以上方法可以单独使用,也可以组合使用以达到所需的Bean销毁顺序控制效果。

以上内容由AI生成,仅供参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913221.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gemini CLI MCP 教程:设置、命令与实际使用

如果你想要为任何 MCP 服务器设置 Gemini CLI,这个快速教程将为你提供指导。 Gemini CLI 结合 MCP(模型上下文协议)服务器,改变了你通过自然语言命令进行编码的方式。 你可以要求 Gemini 分析你的代码库、管理文件、查询数据库,或通过对话提示与 API 交互。 MCP 服务器连…

LangChain 构建向量数据库和检索器

LangChain 构建向量数据库和检索器实战 随着大语言模型&#xff08;LLM&#xff09;在各类 AI 应用中不断普及&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;逐渐成为提升回答准确率与上下文关联性的重要技术路径。 一、什…

基于 LangChain 实现通义千问 + Tavily 搜索 Agent 的简单实践

文章目录 一、相关背景1.1 LangChain 简介1.2 通义千问&#xff08;Tongyi Qianwen&#xff09;1.3 Tavily 实时搜索引擎1.4 架构总览 二、环境配置设置 API 密钥 三、 Tavily 搜索四、智能 Agent 示例&#xff1a;自动判断是否调用 Tavily4.1 初始化 Agent4.2 提问两个问题&am…

SegGPT: 在上下文中分割一切

摘要 我们提出了 SegGPT&#xff0c;一个在上下文中执行“分割一切”的通用模型。我们将各种分割任务统一为一个通用的上下文学习框架&#xff0c;通过将不同类型的分割数据转换为相同的图像格式来兼容这些差异。SegGPT 的训练被建模为一个带有随机颜色映射的上下文着色问题。…

【网络】Linux 内核优化实战 - net.core.busy_read

目录 核心功能工作原理与优势配置方式1. 临时配置&#xff08;重启失效&#xff09;2. 永久配置&#xff08;重启生效&#xff09; 与 net.core.busy_poll 的协同作用适用场景与注意事项适用场景&#xff1a;注意事项&#xff1a; 总结 net.core.busy_read 是 Linux 内核中与网…

alpine安装及配置nodejs开发测试环境

在Alpine Linux上安装和使用Node.js&#xff0c;打造开发和测试的环境。 apk仓库打开社区的源。 先在命令行中使用命令apk search nodejs npm yarn对仓库源进行搜索&#xff0c;&#xff0c;看看nodejs、yarn、npm的版本情况。 localhost:~# apk search nodejs npm yarn nod…

Apache Commons Pool中的GenericObjectPool详解

GenericObjectPool 是 Apache Commons Pool 库中的核心类&#xff0c;用于实现对象的池化管理&#xff0c;适用于数据库连接、HTTP 客户端、线程等昂贵资源的复用。以下从核心概念、工作原理、参数配置、使用场景及最佳实践等方面详细解析&#xff1a; ⚙️ 一、核心概念与组成…

攻防世界CTF题目解析系列————(1)

题目来源:攻防世界wife_wife 打开题目之后&#xff0c;发现登录界面&#xff0c;然后尝试弱口令&#xff0c;sql二次注入&#xff0c;xss发现都没有&#xff0c;然后看见下面go register&#xff08;去注册&#xff09;按钮 成功注册&#xff08;username和password随便搞&…

楚存科技SD NAND贴片式T卡—高性能存储解决方案、赋能AI智能硬件

楚存科技SD NAND贴片式T卡—高性能存储解决方案、赋能AI智能硬件应用 在 AIoT 技术重构产业生态的时代浪潮中&#xff0c;智能硬件正从单一功能终端向数据枢纽演进 —— 智能家居设备日均产生 TB 级交互数据&#xff0c;工业物联网传感器需实时存储生产参数&#xff0c;车载智…

Python[数据结构及算法 --- 查找]

一.顺序查找&#xff08;无序表&#xff09;&#xff1a; def sequentialSearch(alist, item):pos 0found Falsewhile pos < len(alist) and not found:if alist[pos] item:found Trueelse:pos pos 1return foundtestlist [1, 2, 32, 8, 17, 19, 42, 13, 0] print(s…

Seata Saga模式实战:Java微服务中的分布式事务管理

在分布式系统中&#xff0c;Saga模式是一种用于管理跨多个服务的事务的柔性事务解决方案。它通过将长事务拆分为多个本地事务&#xff08;每个事务对应一个服务的操作&#xff09;&#xff0c;并通过补偿机制保证最终一致性。以下是Java中Saga模式的详细介绍&#xff0c;包括实…

若依学习笔记1-validated

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 保证 Spring AOP 相关的依赖包 --><dependency><groupId>org.springframework.boot<…

Excel 如何处理更复杂的嵌套逻辑判断?

处理复杂的嵌套逻辑判断&#xff0c;是Excel进阶路上必然会遇到的一道坎。当简单的IF函数“套娃”变得冗长、难以阅读和维护时&#xff0c;我们就需要更高级、更清晰的工具。 这里介绍三种从基础到高级的处理方法&#xff1a; 传统的 IF 函数嵌套 (经典&#xff0c;但容易混乱)…

使用Claude和MCP增强Selenium

1.配置MCP服务器打开Claude Desktop—>Settings—>Developer—>Edit Config{"mcpServers": {"selenium": {"command": "npx","args": ["-y", "angiejones/mcp-selenium"]}} }配置完成后重启Cl…

数据仓库锚点建模方法的前世今生

数据仓库锚点建模方法&#xff08;Anchor Modeling&#xff09;作为一种面向复杂数据环境的创新方法论&#xff0c;其发展历程与技术演进深刻反映了数据管理从结构化到动态化的转型需求。以下从起源、发展、核心思想、技术演进及未来趋势五个维度&#xff0c;系统梳理锚点建模的…

<三>Sping-AI alibaba 文生图

环境和配置请看&#xff1c;二&#xff1e;Sping-AI alibaba 入门-记忆聊天及持久化 源代码&#xff1a;https://github.com/springaialibaba/spring-ai-alibaba-examples/blob/main/spring-ai-alibaba-image-example/dashscope-image/src/main/java/com/alibaba/cloud/ai/exam…

vue组件和模板

好的&#xff0c;我们来详细解释一下在 Vue&#xff08;以及现代前端开发&#xff09;中两个最核心的概念&#xff1a;组件 (Component) 和 模板 (Template)。 理解了它们&#xff0c;就等于掌握了现代 Web 应用开发的基石。 一个核心比喻&#xff1a;乐高积木 在开始前&…

python学习打卡:DAY 18 推断聚类后簇的类型

浙大疏锦行 聚类后的分析&#xff1a;推断簇的类型 知识点回顾&#xff1a; 推断簇含义的2个思路&#xff1a;先选特征和后选特征通过可视化图形借助ai定义簇的含义科研逻辑闭环:通过精度判断特征工程价值 作业&#xff1a;参考示例代码对心脏病数据集采取类似操作&#xff0c;…

Ubuntu for ARM 更换为阿里云镜像源

1. 简介 该镜像适用于配置 ARM, PowerPC 等其他架构的 ubuntu系统&#xff0c;不适用 x86 &#xff01;&#xff01;&#xff01; 各种版本的Ubuntu for ARM下载地址&#xff1a;https://cdimage.ubuntu.com/releases 2. 配置方法 打开 sources.list 文件。 vim /etc/apt/s…

HTML与JavaScript:构建动态交互式Web页面的基石

HTML与JavaScript&#xff1a;构建动态交互式Web页面的基石 在现代Web开发中&#xff0c;HTML和JavaScript是不可或缺的两位主角。HTML负责页面的结构和内容&#xff0c;而JavaScript则赋予页面生命&#xff0c;使其能够响应用户交互、动态更新内容&#xff0c;并与后端服务进…