SpringEvent事件通知机制

“Spring Event” 是 Spring 框架通过事件驱动的编程模型来处理应用程序中的事件。开发者可以定义自己的事件,然后在应用程序中触发这些事件。Spring 框架提供了用于发布和监听事件的机制,以实现松散耦合的组件间通信。

有两个核心组件:

  • 事件
  • 监听器

案例代码:
1.创建事件

@Getter
public class UserRegisterEvent extends ApplicationEvent {private User user;public UserRegisterEvent(Object source, User user) {super(source);System.out.println(source);this.user = user;}
}

2.创建监听器

@Slf4j
@Component
public class UserRegisterListener {@Autowiredprivate UserBackpackService userBackpackService;@EventListener(classes = UserRegisterEvent.class)public void sendCard(UserRegisterEvent event) {User user = event.getUser();System.out.println("给"+user.getId()+"发改名卡...");}
}

3.发布事件

@Service
public class UserServiceImpl implements UserService {@AutowiredApplicationEventPublisher applicationEventPublisher;@Overridepublic void register(User user) {userDao.save(user);applicationEventPublisher.publishEvent(new UserRegisterEvent(this, user));}
}

4.结果

com.cong.common.user.service.impl.UserServiceImpl@16cc5e5111009发改名卡...

@EventListener 和 @TransactionalEventListener 是 Spring Framework 中用于处理事件的两个注解,它们之间主要的区别在于对事务的处理方式。

总结一下:

@EventListener:

事件监听器和发布事件方法默认是同步(同一个线程)执行,想让监听器异步执行,在监听器上加@Async注解(需要在启动类Application上使用@EnableAsync注解,引入对@Async的支持。)

  • value:用于指定监听的事件类型。可以是单个事件类型,也可以是一个事件类型数组。如果不提供该参数,则默认监听所有事件。
  • classes:与 value 参数类似,用于指定监听的事件类型。可以是单个事件类型,也可以是一个事件类型数组。与 value 不同的是,classes 是 @EventListener 注解的属性名称。
  • fallbackExecution:用于指定当事件处理方法无法执行时是否执行备用方法。默认值为 true,表示如果事件处理方法无法执行,则执行备用方法;设置为 false 表示如果事件处理方法无法执行,则不执行备用方法。
  • condition:用于指定在何种条件下执行事件监听器方法。可以使用 SpEL 表达式来定义条件。如果条件求值为 false,则事件监听器方法不会执行。

在这里插入图片描述

@TransactionalEventListener:用于标记一个方法,表示它是一个事件监听器,并且该方法应该在事务的不同阶段进行调用。

  • value:用于指定监听的事件类型。可以是单个事件类型,也可以是一个事件类型数组。如果不提供该参数,则默认监听所有事件。
  • phase:指定要监听的事务阶段,可以是AFTER_COMMIT、AFTER_ROLLBACK或AFTER_COMPLETION。默认是AFTER_COMMIT。
  • fallbackExecution:用于指定当事务无法提交时是否执行事件监听器。默认值为 true,表示如果事务无法提交,则执行事件监听器;设置为 false 表示如果事务无法提交,则不执行事件监听器。
  • condition:用于指定在何种条件下执行事件监听器方法。可以使用 SpEL 表达式来定义条件。如果条件求值为 false,则事件监听器方法不会执行。

@EventListener和@TransactionalEventListener的使用场景比较,什么时候该用哪个

@EventListener:

事务处理:

  • 不会开启新的事务,事件监听器方法将在发布事件的同一事务中执行。
  • 如果事件监听器方法抛出异常,不会影响到发布事件的事务。

执行阶段:

  • 事件监听器方法默认在事务提交后(TransactionPhase.AFTER_COMMIT)执行。
  • 不支持指定执行阶段。

适用场景:

  • 适用于不需要事务支持的简单事件处理场景。
  • 当事件处理逻辑不依赖于事务,或者对事务没有特殊要求时。

@TransactionalEventListener:

事务处理:

  • 会开启新的事务,事件监听器方法在新的事务中执行。
  • 事件监听器方法的事务与发布事件的事务独立,互不影响。
  • 如果事件监听器方法抛出异常,该事务将回滚,影响到发布事件的事务。

执行阶段:

  • 可以指定事件监听器方法的执行阶段,包括事务提交前、事务提交后、事务回滚后等。
  • 支持更精细的事务控制。

适用场景:

  • 适用于需要事务支持的场景,例如,希望在新事务中执行,或者希望根据事务阶段执行不同的逻辑。
  • 当事件处理逻辑对事务有特殊要求时,例如需要在事务提交前执行某些操作。

总体建议:
如果事件处理逻辑简单,不需要事务支持,或者事务隔离不是关键考虑因素,可以选择使用 @EventListener。
如果事件处理逻辑需要事务支持,或者需要在事务的不同阶段执行不同的逻辑,可以选择使用 @TransactionalEventListener。
总之发布事件方法加了事务用@TransactionalEventListener,没加事务用@EventListener

MQ和SpringEvent两种对比,什么时候该用哪个

消息队列(MQ)和 Spring 事件机制(ApplicationEvent 和相关注解如 @EventListener)是两种不同的通信机制,它们各自有适用的场景和优势。以下是它们的对比和在何时选择使用哪个的一些建议:

MQ(消息队列):

分布式系统:

  • MQ 适用于分布式系统,可以实现异步、解耦、松散耦合的组件通信。
  • 当系统需要将不同服务或模块进行解耦,降低它们之间的直接依赖性时,可以使用消息队列。

持久性:

  • MQ 提供消息的持久性,消息可以被持久化到队列中,确保在消息发送和接收之间出现故障时消息不会丢失。
  • 当系统对消息的可靠性和持久性要求较高时,可以选择使用消息队列。

异步通信:

  • MQ 支持异步通信,生产者将消息发送到队列,而不需要等待消费者的响应。
  • 当系统需要异步处理,提高系统的吞吐量和响应性能时,可以使用消息队列。

消息传递的中间件:

  • MQ 是专门设计用于消息传递的中间件,有多种消息队列系统可供选择,如 RabbitMQ、Apache Kafka、ActiveMQ 等。
  • 当系统需要高度可配置和专门优化的消息传递机制时,可以选择适合的消息队列。

Spring 事件机制:

单体应用或微服务内部通信:

  • Spring 事件机制更适用于单体应用或微服务内部的组件通信,通过 Spring 的事件机制,不同组件之间可以进行解耦,但通信相对于 MQ 更为简单。
  • 当系统是一个相对较小规模的单体应用或内部微服务通信较为简单时,可以选择使用 Spring 事件机制。

松散耦合:

  • Spring 事件机制通过发布-订阅的方式实现组件之间的松散耦合。
  • 当系统中的组件需要解耦,但又不需要引入消息队列等复杂的中间件时,可以选择使用 Spring 事件机制。

同步通信:

  • Spring 事件机制是同步的,发布者会等待所有监听器执行完毕后再继续执行。这与 MQ 的异步通信有所不同。
  • 当系统中的组件之间需要同步通信,且不需要引入异步处理时,可以选择使用 Spring 事件机制。

简化配置和集成:

  • Spring 事件机制是 Spring 框架的一部分,可以方便地与其他 Spring 特性集成,且不需要引入额外的中间件。
  • 当系统中已经使用 Spring 框架,且通信需求较为简单时,可以选择使用 Spring 事件机制。

如何选择:
如果系统是一个分布式系统,需要异步、解耦、持久性、高可靠性的通信机制,可以考虑使用消息队列。
如果系统是一个单体应用或者微服务内部通信相对简单,需要简化配置和集成,可以考虑使用 Spring 事件机制。
在一些场景中,也可以同时使用两者,根据具体的通信需求选择合适的机制。
总的来说,选择 MQ 还是 Spring 事件机制取决于系统的规模、架构、通信需求和对可维护性的要求。

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

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

相关文章

PCL_点云分割_基于法线微分分割

一、概述 PCL_点云分割_基于法线微分分割_点云法向量微分-CSDN博客 利用不同的半径(大的半径、小半径)来计算同一个点的法向量差值P。判断P的范围,从而进行分割。 看图理解: 二、计算流程 1、计算P点小半径的法向量Ns 2、计…

基于乌燕鸥算法优化概率神经网络PNN的分类预测 - 附代码

基于乌燕鸥算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于乌燕鸥算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于乌燕鸥优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络…

Linux上使用Python源码编译安装Python

安装python apt install python3-dev python3 python3-venv yum install python38-devel源码安装Python 1.下载需要的Python版本 Python源码地址:https://www.python.org/downloads/source/ 2.安装gcc(yum install gcc) 3.解压&#xff0c…

最新自动定位版本付费进群系统源码

更新内容: 1.在网站首页增加了付款轮播功能。 2.新增了城市定位功能,方便用户查找所在城市的相关信息。 3.对域名库及支付设置进行了更新和优化。 4.增加了一种图模板设置模式,简化了后台模板设置流程。 5.此外还进行了前后台的其他优化…

缩点+图论路径网络流:1114T4

http://cplusoj.com/d/senior/p/SS231114D 重新梳理一下题目 我们先建图 x → y x\to y x→y,然后对点分类:原串出现点,原串未出现点。 假如我们对一个原串出现点进行了操作,那么它剩余所有出边我们立刻去操作必然没有影响。所…

汽车以太网IOP测试新利器

IOP测试目的 汽车以太网物理层IOP(Interoperability )测试,即测试被测对象以太网物理层之间的互操作性。用于验证车载以太网PHY能否在有限时间内建立稳定的链路;此外,还用于验证车载以太网PHY可靠性相关的诊断特性&am…

23111701[含文档+PPT+源码等]计算机毕业设计javaweb点餐系统全套餐饮就餐订餐餐厅

文章目录 **项目功能简介:****点餐系统分为前台和后台****前台功能介绍:****后台功能介绍:** **论文截图:****实现:****代码片段:** 编程技术交流、源码分享、模板分享、网课教程 🐧裙:77687156…

剑指offer --- 用两个栈实现队列的先进先出特性

目录 前言 一、读懂题目 二、思路分析 三、代码呈现 总结 前言 当我们需要实现队列的先进先出特性时,可以使用栈来模拟队列的行为。本文将介绍如何使用两个栈来实现队列,并给出具体的思路和代码实现。 一、读懂题目 题目:用两个栈实现一…

2023.11.16使用原生js和canvas实现图片矩形框标注功能

2023.11.16使用原生js和canvas实现图片矩形框标注功能 做训练的时候需要一些数据集&#xff0c;但是网上数据集有时不能满足自身的使用需求&#xff0c;自己编制一个标注软件实现数据采集功能。 记录的数据集可以传入后端&#xff0c;在后端再次进行处理。 <!DOCTYPE htm…

【蓝桥杯省赛真题01】C++水下探测器 第十届蓝桥杯中小学生创意编程大赛C++编程比赛省赛真题解析

目录 C/C++水下探测器 一、题目要求 1、编程实现 2、输入输出 二、算法分析

Python----图像的手绘效果

图像的数组表示 图像是有规则的二维数据&#xff0c;可以用numpy 库将图像转换成数组对象 : from PIL import Image import numpy as np imnp.array(Image.open("D://np.jpg")) print(im.shape,im.dtype)结果&#xff1a; 图像转换对应的ndarray 类型是3 维数据&am…

注册表单mvc 含源代码

总结 jsp给我们的ControllerServlet.java,ControllerServlet.java获取参数,信息封装给RegisterFormBean.java的对象看是否符合格式,符合格式再信息封装给UserBean对象,调用Dbutil插入方法查重.]]要创建一个user集合成功跳哪个界面,打印信息注意什么时候要加getsession失败跳哪…

2024年山东省职业院校技能大赛中职组“网络安全”赛项竞赛试题-C

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-C 一、竞赛时间 总计&#xff1a;360分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A、B模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略设置 A-3 流量完整性保护 A-4 …

什么是单域名SSL安全证书?

单域名证书是什么&#xff1f; 单域名证书是指只包含一个具体域名的SSL/TLS证书&#xff0c;它可以用于保护单个主机名的HTTPS通信。例如&#xff0c;如果您有一个网站http://www.example.com&#xff0c;则单域名证书将仅为该域名颁发。 这种证书在保护单个域的安全方面很有…

2.5 Windows驱动开发:DRIVER_OBJECT对象结构

在Windows内核中&#xff0c;每个设备驱动程序都需要一个DRIVER_OBJECT对象&#xff0c;该对象由系统创建并传递给驱动程序的DriverEntry函数。驱动程序使用此对象来注册与设备对象和其他系统对象的交互&#xff0c;并在操作系统需要与驱动程序进行交互时使用此对象。DRIVER_OB…

vscode Prettier配置

常用配置项&#xff1a; .prettierrc.json 是 Prettier 格式化工具的配置文件 {"printWidth": 200, // 指定行的最大长度"tabWidth": 2, // 指定缩进的空格数"useTabs": false, // 是否使用制表符进行缩进&#xff0c;默认为 false"singl…

【MySQL】聚合函数:汇总、分组数据

文章目录 学习目标MAX()、MIN()、AVG()、SUM()、COUNT()COUNT(*) 得到所有记录条目DISTINCT去重练习1&#xff08;使用UNION &#xff0c; SUM&#xff0c; BETEEN AND&#xff09;GROUP BY子句练习2&#xff08;使用sum&#xff0c;group by&#xff0c; join on&#xff0c; …

Redis 配置文件信息中文翻译版

前言 Redis 配置文件信息中文翻译版&#xff0c;方便大家阅读和理解对应参数信息及配置参数信息 # Redis configuration file example# Note on units: when memory size is needed, it is possible to specify # it in the usual form of 1k 5GB 4M and so forth: # 注意:当…

Linux下向Github仓库推送

文章目录 Git 与 Github安装git在github下创建项目下载项目到本地Git三板斧第一板斧 git add第二板斧 git commit第三板斧 git push Git 与 Github Git是目前从开发人员到设计人员的版本控制技术。gitee是国内社交代码托管平台。这是一个你可以玩和实验的地方。在这里你可以找…

Maven依赖管理项目构建工具(保姆级教学)

一、Maven介绍 官网地址&#xff1a;Maven – Introduction Maven 是一款为 Java 项目管理构建、依赖管理的工具&#xff08;软件&#xff09;&#xff0c;使用 Maven 可以自动化构建、测试、打包和发布项目&#xff0c;大大提高了开发效率和质量。 Maven就是一个软件&#…