事件监听-@TransactionalEventListener与@EventListener的介绍、区别和使用

文章目录

  • 前言
    • 事件监听-@TransactionalEventListener与@EventListener的介绍、区别和使用
      • 1. @EventListener 是什么?
      • 2. @TransactionalEventListener 是什么?
      • 3. @TransactionalEventListener与@EventListener的缺点
        • 3.1. @TransactionalEventListener 的缺点:
        • 3.2. @EventListener 的缺点:
      • 4. @EventListener与MQ的优缺点
        • 4.1 @EventListener 的优缺点
        • 4.2 消息队列(MQ)的优缺点:
      • 5.@EventListener 示例
        • 5.1. 事件监听类
        • 5.2. 事件类:
        • 5.3. 测试代码
        • 5.4. 测试

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


事件监听-@TransactionalEventListener与@EventListener的介绍、区别和使用

1. @EventListener 是什么?

@EventListener是Spring Framework中的注解,用于声明事件监听器方法。它用于将一个方法标记为事件监听器,并定义了该方法应该在接收到特定事件时被调用。

当使用@EventListener注解标记一个方法时,Spring会将该方法注册为一个事件监听器,并在事件发布时自动调用它。监听器方法通常被定义在Spring应用程序的各个组件中,例如Bean类、Service类等。

使用@EventListener注解时,方法的参数可以是事件对象,也可以是包含事件对象的包装对象。当事件被发布时,Spring会自动寻找匹配事件类型的监听器方法并调用它们。

2. @TransactionalEventListener 是什么?

@TransactionalEventListener 是一个注解,用于在Spring应用程序中声明事务事件监听器的方法。它是Spring Framework中的一项功能,用于简化基于事件的编程模型。

@TransactionalEventListener 注解可以应用在方法上,指示该方法是一个事务事件监听器。当触发指定类型的事件时,Spring将自动调用带有 TransactionalEventListener 注解的方法,并在事务上下文中执行该方法。

@TransactionalEventListener 注解可以配置以下属性:

  1. value:指定监听的事件类型,可以是单个事件类型或事件类型数组。
  2. fallbackExecution:指定是否使用回退执行模式。当事务存在且已经激活时,如果设置为 false,则监听器方法将不会在事务上下文中执行;如果设置为 true,则将回退到非事务执行。
  3. phase:指定方法的执行阶段。默认为 TransactionPhase.AFTER_COMMIT,表示在事务提交后执行方法,还可以选择
    TransactionPhase.BEFORE_COMMIT、
    TransactionPhase.AFTER_ROLLBACK和TransactionPhase.AFTER_COMPLETION。

@TransactionalEventListener 注解的使用可以方便地将事件处理与事务管理结合起来,确保事件监听器方法在适当的事务上下文中执行,并能够在事件处理过程中进行事务管理操作。

3. @TransactionalEventListener与@EventListener的缺点

3.1. @TransactionalEventListener 的缺点:

  • 依赖于事务管理:@TransactionalEventListener注解需要依赖于Spring的事务管理机制。如果应用程序中没有启用事务管理或未配置适当的事务管理器,@TransactionalEventListener注解可能无法正常工作。
  • 隐式事务传播:@TransactionalEventListener注解默认使用容器的默认事务传播行为,这可能导致意外的事务行为。如果不清楚事务传播的规则,可能会导致意外的结果。

3.2. @EventListener 的缺点:

  • 缺乏事务支持:@EventListener注解并没有直接支持事务处理。因此,如果需要在事件处理中进行事务管理或需要在特定事务上下文中执行事件处理逻辑,就无法直接通过 @EventListener 注解实现,需要使用其他手段来实现事务管理。
  • 无法处理异步事件:@EventListener注解默认是同步执行的,即事件发布和事件处理都在同一线程中。如果需要处理异步事件,需要借助其他异步处理机制,如使用Spring的异步方法或使用消息中间件等。

4. @EventListener与MQ的优缺点

4.1 @EventListener 的优缺点

优点:

  • 简单易用:使用 @EventListener 注解,开发人员可以轻松地将方法标记为事件监听器,无需额外的配置和复杂的代码。
  • 高内聚性:将事件和事件处理器放在同一个类中,可以提高代码的可读性和维护性。
  • 低耦合性:事件发布者和事件监听者之间没有直接依赖关系,它们通过事件进行解耦,可以方便地添加或删除事件处理器。
  • 异步处理:事件监听器可以使用多线程或异步任务来处理事件,从而提高应用程序的性能和响应能力。

缺点:

  • 限制于单个应用程序:@EventListener 适用于单个应用程序内部的事件处理,如果需要跨应用程序进行事件通信,就无法使用该机制。
  • 缺乏消息持久性:@EventListener 机制并没有提供消息持久性的特性,一旦事件发布后,如果没有监听者或监听者未能处理消息,消息将会丢失。

4.2 消息队列(MQ)的优缺点:

优点:

  • 异步通信:MQ 允许发布者将消息发送到队列中,而不需要等待消费者处理。这种异步通信方式可以提高系统的可伸缩性和吞吐量。
  • 可靠性:MQ 提供持久化机制,可以确保消息在发送过程中不会丢失,并且可以在消费者处理失败时进行重试。
  • 解耦和灵活性:通过将消息发布到队列中,不同的应用程序可以独立演化和扩展,它们只需要共享相同的消息格式和协议即可进行通信。
  • 可以跨应用程序使用:MQ 可以用于实现不同应用程序之间的集成和消息传递,使系统的各个组件能够松耦合地协同工作。

缺点:

  • 引入复杂性:使用 MQ 增加了系统的复杂性,需要额外的配置和管理 MQ 服务器。
  • 系统可用性依赖于 MQ:如果 MQ 服务器出现故障或性能问题,整个系统的可用性和性能可能会受到影响。
  • 增加了延迟:由于 MQ 是异步通信的机制,消息的传递和处理可能会引入一定的延迟。

5.@EventListener 示例

5.1. 事件监听类

    @Async@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT,classes = OneEvent.class)@Order(0)public void testOneEventHandler(OneEvent event) {log.info("=====================OneEvent===================:{}",event.getName());}@Async@EventListener(classes = TwoEvent.class)@Order(0)public void twoEventEventHandler(TwoEvent event) {log.info("=====================TwoEvent===================:{}",event.getName());}

5.2. 事件类:

@Getter
@Setter
@ToString
public class OneEvent extends ApplicationEvent {private String  name;public OneEvent() {super("OneEvent async message");}//======================================================public String getName() {return name;}public void setName(String name) {this.name = name;}
}

@Getter
@Setter
@ToString
public class TwoEvent extends ApplicationEvent {private String  name;public TwoEvent() {super("TwoEvent async message");}//======================================================public String getName() {return name;}public void setName(String name) {this.name = name;}}

5.3. 测试代码

Controller:

    @AutowiredTestService service;@ApiOperation(value = "测试", notes = "测试")@CommonLog(methodName = "测试",className = "TestController#event")@RequestMapping(value = "/v1/event", method = RequestMethod.POST)public void event(){TwoEvent event1 = new TwoEvent();event1.setName("eiuyriuw");SpringContextUtil.getApplicationContext().publishEvent(event1);service.test();}

Service:

public interface TestService {void test();
}
@Service
@Slf4j
public class TestServiceImpl implements TestService {@Transactional@Overridepublic void test() {OneEvent event = new OneEvent();event.setName("uiuoiuo");SpringContextUtil.getApplicationContext().publishEvent(event);}
}

5.4. 测试

调用测试代码
在这里插入图片描述

测试成功!!!

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

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

相关文章

2.9 PE结构:重建导入表结构

脱壳修复是指在进行加壳保护后的二进制程序脱壳操作后,由于加壳操作的不同,有些程序的导入表可能会受到影响,导致脱壳后程序无法正常运行。因此,需要进行修复操作,将脱壳前的导入表覆盖到脱壳后的程序中,以…

openGauss学习笔记-69 openGauss 数据库管理-创建和管理普通表-更新表中数据

文章目录 openGauss学习笔记-69 openGauss 数据库管理-创建和管理普通表-更新表中数据 openGauss学习笔记-69 openGauss 数据库管理-创建和管理普通表-更新表中数据 修改已经存储在数据库中数据的行为叫做更新。用户可以更新单独一行、所有行或者指定的部分行。还可以独立更新…

【linux基础(六)】Linux中的开发工具(中)--gcc/g++

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到开通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 Linux中的开发工具 1. 前言2.…

为什么建议将常量用const关键字来修饰

嵌入式软件中,内存资源是非常宝贵的,即sram资源。因此我们在编码过程中需要规划好并且使用好sram资源,这点非常重要! 在此之前需要预备一点基础知识,在IAR中,一般会用ICF配置文件给工程配置存储区域&#…

MongoDB差异数据对比的快速指南

MongoDB是一种非关系型数据库,它以灵活的 JSON-like 文档的形式存储数据,这种特性使其在处理大量数据和实现快速开发时更具有优势。而由于其灵活的数据模型和强大的性能,MongoDB 被广泛应用在各种业务场景中。随着业务的发展和数据的增长&…

vue中v-for循环数组使用方法中splice删除数组元素(错误:每次都删掉点击的下面的一项)

总结:平常使用v-for的key都是使用index,这里vue官方文档也不推荐,这个时候就出问题了,我们需要key为唯一标识,这里我使用了时间戳(new Date().getTime())处理比较复杂的情况, 本文章…

解决虚拟机重启后ifconfig看不到IP的问题

目录 背景 解决方案 背景 虚拟机,桥接模式,启动后一切正常,但重启后发现终端连不上虚机了,也ping不到,最后检查发现,IP消失了,虚机没有IP了。 解决方案 不论是否重启,只要是看不…

【css | loading】各种简单的loading特效

先看一下简单的效果图 线上预览 https://code.juejin.cn/pen/7278511766991339579 代码 HTML <!-- / 1 --><section><div class"sk-rotating-plane"></div></section><!-- / 2 --><section><div class"sk-doub…

【CSS3】

文章目录 1.简介2.边框3.圆角4.背景5.渐变CSS3 径向渐变6.文本效果7.字体8.2D转换9.3D转换10.过渡11.动画12.多列13.用户界面14.按钮 ​ 1.简介 模块 CSS3 被拆分为"模块"。旧规范已拆分成小块&#xff0c;还增加了新的。 一些最重要 CSS3 模块如下&#xff1a; 选…

内网隧道代理技术(二十六)之 搭建ICMP隧道上线CS

搭建ICMP隧道上线CS ICMP隧道原理 ICMP隧道简单实用,是一个比较特殊的协议。在一般的通信协议里,如果两台设备要进行通信,肯定需要开放端口,而在ICMP协议下就不需要。最常见的ping命令就是利用的ICMP协议,攻击者可以利用命令行得到比回复更多的ICMP请求。在通常情况下,…

input 的 placeholder 样式

::placeholder 伪元素 这个伪元素可以改变 input、textarea 占位文本的样式。 input::placeholder {color: green; }完整的兼容性写法&#xff1a; input {&::-webkit-input-placeholder, /* WebKit browsers*/ &:-moz-input-placeholder, /* Mozilla Firefox 4 to …

67、数据源配置 及 配置多个数据源--C3P0 数据源 和 Hikari 数据源

★ Spring Boot如何选择DataSource数据源 优先级从高到低&#xff1a; HikariCP > Tomcat pooling DataSource > Commons DBCP2 如果要使用Tomcat pooling DataSource这种池化数据源&#xff0c; 那么可以用</exclusions>这个把HikariCP 排除掉&#xff0c;然后sp…

16. Docker容器监控CAdvisor+InfluxDB+Granfana

目录 1、前言 2、原始命令 3、CAdvisorInfluxDBGranfana 3.1、什么是CAdvisor 3.2、什么是Influxdb 3.3、什么是Granfana 4、安装使用 4.1、安装influxdb 4.2、安装CAdvisor 4.3、安装Granfana 4.4、访问Influxdb 4.5、创建CAdvisor数据库 4.6、访问CAdvisor 4.7…

评价模型:层次分析法

1. 模型建立 1.1 建立层次结构模型 在深入分析实际问题的基础上&#xff0c;将有关的各个因素按照不同属性自上而下地分解成若干层次&#xff0c;同一层的诸因素从属于上一层的因素或对上层因素有影响&#xff0c;同时又支配下一层的因素或受到下层因素的作用。最上层为目标层…

python集合

集合set set_python1.集合的创建2.集合的相关操作3.集合间的关系4.集合的数学操作5.集合生成式 set_python 集合(set)是一个可变的数据类型&#xff0c;它用于存储一组唯一的元素。集合中的元素是无序的&#xff0c;并且不能重复。可以使用大括号{}或者set()函数来创建一个集合…

C# OpenVino Yolov8 Pose 姿态识别

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp;namespace OpenVino_Yolov8_Demo {public…

API原理概念篇(六)玩转正则表达式等常用API

一 玩转正则表达式等常用API ① 正则 1、openresty存在两套正则表达式规范1) lua自身独有的正则规范 备注&#xff1a;大约有5%&#xff5e;15%性能损耗损耗原因&#xff1a;表达式compile成pattern,并不会被缓存,每次都会被重新compile编译2) nginx的符合POSIX规范的PCR…

IJK源码分析-android篇

整个IJK播放器框架相较于原始ffplay.c播放器,在三处进行了抽象,分别是: (1)解码器配置初始化操作,对应的数据结构是: struct IJKFF_Pipeline {SDL_Class *opaque_class;IJKFF_Pipeline_Opaque *opaque;void (*func_destroy) (IJKFF_Pipe…

合宙Air724UG LuatOS-Air LVGL API控件-微调框 (Spinbox)

微调框 (Spinbox) 微调框用于数值调整&#xff0c;有时候我们希望获取一个用户输入的数值&#xff0c;但是又不希望弹出键盘&#xff0c;可以使用微调框。 示例代码 -- 回调函数 function spinbox_increment_event_cb(obj, event)if event lvgl.EVENT_SHORT_CLICKED thenlvg…

openssl websockets

1. HTTPS通信的C实现 - 知乎