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.mzph.cn/news/142858.shtml

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

相关文章

centos 6.10 安装 tcmalloc

安装 libunwind-1.6.2 下载地址 解压文件 cd libunwind-1.6.2 ./configure make && make install另一种方式 从 github 上下载的项目, 在执行autoreconf -i 时一直报错,libtool 未定义, 要先在当前目录执行 libtoolize,再执行 au…

PostGIS学习教程五:简单的SQL语句

SQL,或"Structured Query Language-结构化查询语言",是对关系数据库进行查询数据和更新数据的一种方法。 当我们创建第一个数据库时,你已经看到了SQL: SELECT postgis_full_version();查看PostGIS的版本信息。 在前面的…

应届裁员,天胡开局——谈谈我的前端一年经历

应届裁员,天胡开局——谈谈我的前端一年经历 许久没有更新了,最近一个月都在忙,没错,正如题目所说,裁员然后找工作… 这周刚重新上班,工作第二天,感慨良多,记录些什么吧。 去年十…

基于springboot实现学生选课平台管理系统项目【项目源码】计算机毕业设计

基于springboot实现学生选课平台管理系统演示 系统开发平台 在该地方废物回收机构管理系统中,Eclipse能给用户提供更多的方便,其特点一是方便学习,方便快捷;二是有非常大的信息储存量,主要功能是用在对数据库中查询和…

Outlook如何恢复已删除邮件

Outlook如何恢复已删除邮件 操作指引: Outlook客户端恢复最近7天删除的邮件: Outlook客户端要求最新版本,如没有如下选项,建议联机更新windows update 网页邮箱恢复最近7天删除的邮件:

MySQL 社区开源备份工具 Xtrabackup 详解

文章目录 前言1. Xtrabackup 介绍1.1 物理备份与逻辑备份区别1.2 Xtrabackup 系列版本 2. Xtrabackup 部署2.1 下载安装包2.2 二进制部署2.3 程序文件介绍2.4 备份需要的权限 3. Xtrabackup 使用场景3.1 本地全量备份3.2 本地压缩备份3.3 全量流式备份3.3.1 备份到远程主机3.3.…

喷墨打印的简单介绍

喷墨打印是一种常见的打印技术,使用液体墨水将图像或文本喷射到纸张或其他打印材料上。以下是喷墨打印的主要特点,优秀的喷头厂家,应用场景以及未来发展趋势的概述: **喷墨打印的特点:** 1. **高分辨率:**…

0基础学习PyFlink——水位线(watermark)触发计算

在《0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows)》和《0基础学习PyFlink——个数滑动窗口(Sliding Count Windows)》中,我们发现如果窗口中元素个数没有把窗口填满,则不会触发计算。 为了解决长期不计算的问题&a…

切换为root用户后,conda:未找到命令

问题:切换为root用户后,conda:未找到命令 结论详细用户切换配置路径 结论 问题:切换为root用户后,conda:未找到命令 (anaconda) 解决:在~/.bashrc配置里增加conda的路径 详细 用户切换 1 切…

Interactive Analysis of CNN Robustness

Interactive Analysis of CNN Robustness----《CNN鲁棒性的交互分析》 摘要 虽然卷积神经网络(CNN)作为图像相关任务的最先进模型被广泛采用,但它们的预测往往对小的输入扰动高度敏感,而人类视觉对此具有鲁棒性。本文介绍了 Pert…

微信小程序display常用属性和子元素排列方式介绍

wxss中display常用显示属性与css一致,介绍如下: 针对元素本身显示的属性: displayblock,元素显示换行displayinline,元素显示换行,但不可设置固定的宽度和高度,也不可设置上下方向的margin和p…

Python | 机器学习之聚类算法

​🌈个人主页:Sarapines Programmer🔥 系列专栏:《人工智能奇遇记》🔖少年有梦不应止于心动,更要付诸行动。 目录结构 1. 机器学习之聚类算法概念 1.1 机器学习 1.2 聚类算法 2. 聚类算法 2.1 实验目的…

Riskified: 2023年电商政策滥用问题恶化,正严重挑战商家盈利底线

2023年11月14日,中国上海 —— 近日,由全球领先的电子商务欺诈和风险智能解决方案提供商 Riskified 发布的《政策滥用及其对商家的影响:2023年全球参考基准》报告显示,政策滥用问题正进一步恶化,超过九成电商商家正在承…

Linux中的find、grep

find 用法:find 路径 -name 文件名 在指定的路径下查找指定的文件, 会从指定路径下包括所有的子目录当中寻找 grep grep 查找信息 文件名 在指定的文件中查找指定的内容 grep 查找信息 文件名 -n 在指定的文件中查找指定的内容将 查找到的内容整行输出并…

七个优秀微服务跟踪工具

随着微服务架构复杂性的增加,在问题出现时确定问题的根本原因变得更具挑战性。日志和指标为我们提供了有用的信息,但并不能提供系统的完整概况。这就是跟踪的用武之地。通过跟踪,开发人员可以监控微服务之间的请求进度,从而使他们…

vue如何解决跨域?原理?

Vue.js本身并不直接解决跨域问题,而是依赖于浏览器的同源策略。但是,Vue提供了一些方法来帮助我们解决跨域问题。 原理: 浏览器的同源策略规定,不同源(协议、域名、端口)之间的网络请求受到限制&#xff…

WebSocket真实项目总结

websocket websocket是什么? websocket是一种网络通讯协议。 websocket 是HTML5开始提供的一种在单个TCP链接上进行全双工通讯的协议。 为什么需要websocket? 初次接触websocket,都会带着疑惑去学习,既然已经有了HTTP协议,为什么还需要另一…

GEE教程——Landsat7影像条带修复填充方法(核函数线性插值填充)填充后的NDVI为例

简介: Landsat 7卫星的传感器为ETM+传感器,它有8个波段,其中第一波段为蓝色波段,第二波段为绿色波段,第三波段为红色波段。由于该传感器的扫描镜头故障,在接收到的数据中存在条带状的颜色差异,导致图像质量下降。修复该问题的一种方法是使用更高分辨率的传感器数据来填…

【数据结构】——单链表(增删查改)

目录 前言: 一:单链表的特点 ​编辑 二:单链表实现 单链表定义 2.1申请节点(初始化) 2.2单链表尾插 ​编辑 2.3单链表打印 2.4单链表头插 2.5单链表尾删 2.6单链表头删 2.7单链表查找 2.8在目标位置后面插入…

唯坚持而已

写在前面 假如有一天我失业了: 大葱一毛二一斤,卖一三轮车三百斤还不到40块钱,我会回乡种大葱么? 小麦、玉米块儿八毛的一斤,亩产1000斤,五亩地,一年一茬小麦一茬玉米,才万把块钱&a…