SpringEvent事件通知机制

news2024/11/19 15:24:29

“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 {

    @Autowired
    private 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 {

    @Autowired
    ApplicationEventPublisher applicationEventPublisher;
    
    @Override
    public 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.coloradmin.cn/o/1210518.html

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

相关文章

《视觉SLAM十四讲》-- 后端 1(下)

8.2 BA 与图优化 Bundle Adjustment 是指从视觉图像中提炼出最优的 3D 模型和相机参数(内参和外参)。 8.2.1 相机模型和 BA 代价函数 我们从一个世界坐标系中的点 p \boldsymbol{p} p 出发,把相机的内外参数和畸变都考虑进来,…

如何选择一款高效稳定的文件夹同步软件?

随着办公自动化云化,大数据化等网络的发展,企业的生存发展离不开数据业务,每个企业每天都得处理大量数据。同时随着企业结构分散化的不断扩大,企业内部和企业间的信息互动更加频繁。越来越多的企业要求内部各种业务数据在服务器、…

会议邀请 | 思腾合力邀您共赴第二十五届高交会(CHTF2023)

2023年11月15-19日,以“激发创新活力 提升发展质量”为主题的「第二十五届中国国际高新技术成果交易会(CHTF2023)」将在深圳会展中心(福田)和深圳国际会展中心(宝安)举办。思腾合力作为行业领先…

Vue 简介

1.Vue是什么? Vue 是一个用于 构建用户界面 的 渐进式 框架 1. 构建用户界面:基于 数据 动态 渲染 页面 2. 渐进式: 循序渐进 的学习,理解一部分即可进行实现 3. 框架:一套完整的项目解决方案, 提…

新生儿吐奶:原因、科普和注意事项

引言: 新生儿吐奶是许多新父母常见的经历,尽管大多数情况下是正常的,但对于父母来说,了解吐奶的原因以及如何处理是至关重要的。本文将科普新生儿吐奶的原因,提供相关信息,并为父母和监护人提供注意事项&a…

C# - System.Action

.net 内置的一种委托 using System; private Action m_Action; m_Action Func1; m_Action Func1; m_Action Func2;m_Action?.invoke()//获取委托中的Action列表 var actionList m_Action.getInvocationList();//委托中是否存在指定的Action var isExit Array.IndexOf(act…

虹科示波器 | 汽车免拆检修 | 2021款广汽丰田威兰达PHEV车发动机故障灯异常点亮

一、故障现象 一辆2021款广汽丰田威兰达PHEV车,搭载A25D-FXS发动机和动力蓄电池系统(额定电压为355.2V,额定容量为45.0Ah),累计行驶里程约为1万km。车主反映,高速行驶时发动机突然抖动,且发动机…

第三天课程 RabbitMQ

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应&am…

移动端APP版本治理

1 背景 在许多公司,APP版本都是不受重视的,产品忙着借鉴,开发埋头编码,测试想着不粘锅。 只有在用户反馈app不能用的时候,你回复客服说,让用户升级最新版本,是不是很真实。 而且业界也很少有…

苹果手机照片如何导入电脑?无损快速的传输办法分享!

前些天小编的朋友联系到我,说是自己苹果手机里面的照片太多,有好几千张,不知道该怎么快而无损地传到电脑。我想遇到这种情况的不止是小编的朋友,生活中遇到手机照片导入电脑的同学不在少数。不管是苹果手机还是安卓手机&#xff0…

8.GC基本原理

目录 概述垃圾回收引用计数法 (Reference Counting)根可达分析算法 (GCRooting Tracing)对象引用类型强引用软引用弱引用 清除垃圾1.标记-清除算法 (Mark-Sweep)2.复制算法 (Copying)3.标记-整理算法 (Mark-Compact)分代回收 (Generational Collection) 垃圾回收器GC-串行收集器…

《网络协议》07. 其他协议

title: 《网络协议》07. 其他协议 date: 2022-10-07 18:24:02 updated: 2023-11-15 08:00:52 categories: 学习记录:网络协议 excerpt: IPv6、WebSocket、WebService(SOAP,WSDL)、HTTPDNS、FTP、邮件(SMTP,…

上机实验三 图的最小生成树算法设计 西安石油大学数据结构

二叉树设计 实验名称:二叉树设计 (1)实验目的: 1) 掌握二叉树的逻辑结构。 2) 掌握二叉树的二叉链表存储结构; 3) 掌握基于二叉链表存储的二叉树的遍历等操作的实现。 &#x…

Kibana:使用 “链接” 面板简化 Kibana 仪表板导航 - Links panel

作者:Teresa Alvarez Soler 我们很高兴地宣布 Kibana 仪表板的最新功能版本:链接面板(Links panel),这是在仪表板之间组织和导航的简单方法。 此功能在 Kibana 8.11 的技术预览版中提供。 有时你可能希望创建多个主题…

μC/OS-II---计时器管理1(os_tmr.c)

目录 创建一个计时器重新启动一个计时器停止一个计时器删除一个计时器 计时器是倒计时器,当计数器达到零时执行某个动作。用户通过回调函数提供这个动作。回调函数是用户声明的函数,在计时器到期时被调用。在回调函数中绝对不能进行阻塞调用(…

SUMO道路封闭车辆绕行仿真实验【TraCI】

本文将介绍如何在 SUMO 交通模拟中动态选择车辆绕行指定道路。 绕道是城市驾驶中的常见现象,造成原因有很多,包括建筑和交通事故等。 无论出于何种原因,并非所有车辆都会选择避开这些道路; 有些人可能会毫不犹豫地直接开车过去&a…

Payshield 10K是什么意思?有什么作用?

PayShield 10K是一种支付安全产品,由数字货币和法币混合而成的数字货币产品。它的意思是保护商家在交易过程中可能遭受的损失。这种产品的主要作用是保护数字货币支付系统的安全,并确保商家在交易过程中获得他们应得的收益。 PayShield 10K具有以下特点和…

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

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

Domino为外出Internet邮件设置DKIM签名

大家好,才是真的好。 如果你看了上篇《Domino中和邮件安全有关的SPF、DKIM介绍》内容,想必就对DKIM概念不陌生,当然,上篇我们讲的是邮件入站的SFP、DKIM签名检查,这篇讲述的是外出邮件的DKIM签名。 是的,…

算不上最全,但都是必备——Spring MVC这些不会不行啊

Spring MVC篇 Spring MVC执行流程 四大组件 前端控制器DispatcherServlet处理器映射器HandlerMapping处理器适配器HandlerAdaptor视图解析器ViewResolver 视图阶段(JSP) 请求先到前端控制器DispatcherServlet DispatcherServlet将根据该请求的路径去…