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 {

    @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 事件机制取决于系统的规模、架构、通信需求和对可维护性的要求。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot实现校园医疗保险管理系统【项目源码】计算机毕业设计

基于springboot实现校园医疗保险管理系统演示 系统开发平台 在线校园医疗保险系统中,Eclipse能给用户提供更多的方便,其特点一是方便学习,方便快捷;二是有非常大的信息储存量,主要功能是用在对数据库中查询和编程。其…

SLF4J: Class path contains multiple SLF4J bindings.

问题截图 问题原因 这里就是由于hbase 安装路径下的一个文件和hadoop安装路径下的文件起冲突了 解决办法 我的路径: 这个一定要看自己电脑上的路径 /usr/local/hbase/lib/client-facing-thirdparty/ slf4j-log4j12-1.7.25.jar更名为: /usr/local/hb…

docker部署Prometheus+Cadvisor+Grafana实现服务器监控

一:Prometheus 1:介绍: Prometheus是一个在SoundCloud上构建的开源系统监视和警报工具包 2:特点 多维度数据模型-由指标键值对标识的时间序列数据组成;PromQL,一种灵活的查询语言;不依赖分布…

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

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

NOIR脑机接口机器人——让脑机接口通过少样本学习实现做家务的能力

一、概述 大脑与机器人接口(BRI)是人类艺术、科学和工程的集大成之作,其影响已经贯穿于无数科幻作品和创意艺术之中,如《黑客帝国》和《西部世界》等。然而,要真正实现BRI并创造出能够与人类完美协同运作的机器人系统…

前端开发好用的vscode插件

1.TONGYI Lingma 通义灵码,是一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力,并针对阿里云 SDK/API 的使用场景调优&#xff0…

音频限幅器电路芯片D2761,工作电压范围宽,输出噪声低

D2761是为保护扬声器所设计的音频限幅器,其限幅值可通过外接电 阻来调节,适合在个人电脑、便携式音响等系统中作音频限幅用。 主要特点: ● 工作电压范围宽:2.7V ~ 13.0V ● 外接电阻调节限幅范围:0.2V …

UE4动作游戏实例RPG Action解析四:装备系统

导语: 以加血道具为例,详细分析拆解ActionRPG的装备系统,包含装备系统需求和数据结构设计,以及实现 一、装备系统需求: 装备槽: 已获取装备和未获取装备: 当已经装备一个道具时,再次捡到道具,会把道具放在装备库,不会放在装备槽中, 当没有装备道具时,会拾取道具…

Android图片压缩插件

今天才发现这个还有插件,平时都是传网站上压缩完了又下载下来覆盖原文件。现在有这个了,开发好高效😁!分享给大家,可能对你们有用哈哈😆。也可能你们早都知道了……

P6入门:项目初始化10-项目详情之设置Setting

前言 使用项目详细信息查看和编辑有关所选项目的详细信息,在项目创建完成后,初始化项目是一项非常重要的工作,涉及需要设置的内容包括项目名,ID,责任人,日历,预算,资金,分类码等等&…

java实现计数排序

图解 计数排序是一种线性时间复杂度的排序算法,它不基于比较排序,而是根据待排序序列中元素的值来进行排序。 具体的过程如下: 统计序列中每个元素出现的个数,得到一个计数数组count。其中,count[i]表示待排序序列中值…

专业的SRM系统全流程管理服务

一、什么是SRM系统 SRM系统,即供应商关系管理,是供应链管理中的重要组成部分,帮助企业与供应商建立、维护和改善业务关系,以实现双方共赢。本文将从供应商寻源到合同签订、订单履行、到付款及供应商评价等环节,阐述SR…

【开源】基于Vue.js的超市自助付款系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目详细录屏 二、研究内容2.1 商品类型模块2.2 商品模块2.3 超市账单模块 三、界面展示3.1 登录注册模块3.2 超市商品类型模块3.3 超市商品模块3.4 商品购买模块3.5 超市账单模块 四、部分源码展示4.1 实体类定义4.2 控制器接口 五、配套文档展示…

.pcd文件格式

更详细的格式介绍可以查看我的这篇博客 『Open3D』安装与点云格式通识_open3d安装_NNNNNathan的博客-CSDN博客文章浏览阅读1.9k次。介绍了open3d的安装和当前适用与存储点云信息的文件格式,并详细介绍了pcd与ply两种格式。_open3d安装https://blog.csdn.net/qq_413…

【QT系列教程】之二创建项目和helloworld案例

文章目录 一、QT创建项目1.1、创建项目1.2、选择创建项目属性1.3、选择路径和项目名称1.4、选择构建项目类型1.5、布局方式1.6、翻译文件,根据自己需求选择1.7、选择套件1.8、项目管理,自行配置1.9、配置完成,系统自动更新配置 二、QT界面介绍…

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

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

Bun 1.0 正式发布,爆火的前端运行时,速度遥遥领先!

目录 前言: 一、包子1.0 二、Bun 是一个一体化工具包 为什么包子存在 二、Bun 是一个 JavaScript 运行时 Node.js 兼容性 速度 TypeScript 和 JSX 支持 ESM 和 CommonJS 兼容性 网络 API 热重载 插件 Bun:全能的工具包 Bun 为什么会出现&…

AI创作系统ChatGPT网站源码+支持最新GPT-Turbo模型+支持DALL-E3文生图/AI绘画源码

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

ssm047网上服装销售系统+jsp

ssm047网上服装销售系统jsp 交流学习: 更多项目: 全网最全的Java成品项目列表 https://docs.qq.com/doc/DUXdsVlhIdVlsemdX 演示 项目功能演示: ————————————————

用 Raspberry Pi 5 构建文件服务器(NAS)

系列文章目录 文章目录 系列文章目录前言一、软件设置二、存储器设置三、配置总结 前言 2023 年 11 月 13 日 本-埃弗拉德 这个 #MagPiMonday 周一,学习如何利用 Raspberry Pi 5 的新功能制作更好的 NAS。本教程是 MagPi 推出的 Raspberry Pi 5 特辑的一部分。 M.…