spring事件监听event(默认的mq)

news2024/11/6 3:04:21

文章目录

  • 前言
  • 一、event是什么?
  • 二、使用步骤
    • 1.事件
    • 2.事件监听
    • 3.发布事件
  • 三、测试结果
  • 总结


前言

项目中的业务难免是相互关联的,但是代码中我们应该尽量做到低耦合,常见的做法就是引入mq来作为松耦合的一种手段;
其实最常见的解耦和就是接口了,MVC直接通过接口(约定好的一种规则)相互调用,都是解耦的一种体现;
还有就是springbean aop等 也就是IOC 都是解耦和的场景;

通常mq是我们的选择,但是当仅仅是为了解耦的简单业务场景,其实完全没必要引入mq,而spring中的event则就可以实现解耦~


一、event是什么?

使用场景 一处变动影响范围较大,如果都将代码写在一起会造成耦合很高,这样利用event或者mq 可以解耦

当下单成功后:
1 扣减库存
2 维护个人信息
3 物流信息
4 订单流水
5 商品销量
6 …

event 是spring提供的,在 org.springframework.context.event
它由三部分组成:

  1. 事件
  2. 事件监听
  3. 事件发布

二、使用步骤

1.事件

声明一个类,继承ApplicationEvent 即可,然后可以放入一个自己创建的作为信息传递的载体(Bom), 这个Bom可有可无

public class DemoEvent extends ApplicationEvent {

    private Bom bom;

    public DemoEvent(Bom source) {
        super(source);
        this.bom = source;
    }

    public Bom getBom() {
        return bom;
    }
}

2.事件监听

事件监听有两种方式: 1 注解 2 实现ApplicationListener接口 其实都是一个意思 3 条件过滤

  1. 注解 可以同监听多个类
@Slf4j
@Component
public class DemoEventListener {

    @EventListener(classes = DemoEvent.class)
    public void listener(DemoEvent event) {
        log.info(JSONUtil.toJsonStr(event));
    }
}
  1. 实现接口
@Slf4j
@Component
public class DemoEventListener1 implements ApplicationListener<DemoEvent> {

    @Override
    public void onApplicationEvent(DemoEvent event) {
        log.info(JSONUtil.toJsonStr(event));
    }
}
  1. 注解的基础上,再次过滤
@Slf4j
@Component
public class DemoEventListener2 {

    @EventListener(condition = "#root.event.bom.f4.equals('2')")
    public void listener(DemoEvent event) {
        log.info(JSONUtil.toJsonStr(event));
    }
}

其中 #root.event.bom.f4 就是条件
#root.event 固定的
bom 是我们在事件中自定义的参数名称
f4 是其中的一个属性名称

还可以这样写:

@EventListener(condition = “#root.getEvent().getBom().getF4().equals(‘2’)”)
这样更好理解哈~

3.发布事件

搞一个测试类


@SpringBootTest
class DemoEventListenerTest {

    @Autowired
    ApplicationEventPublisher applicationEventPublisher;

    @Test
    public void publishPersonSaveEvent(){
        Bom bom = new Bom();
        bom.setF4("12");;
        bom.setF6("12");
        DemoEvent demoEvent = new DemoEvent(bom);
        applicationEventPublisher.publishEvent(demoEvent);

        bom.setF4("2");;
        bom.setF6("12");
        applicationEventPublisher.publishEvent(new DemoEvent(bom));
    }
}

三、测试结果

结果

可以看到两个监听类中都接受到了ApplicationEventPublisher 发布者发布的消息内容;
但是 DemoEventListener2 由于根据条件过滤,只接受到了一条消息;


总结

对于这种简单的业务解耦,我们应该优先选择spring提供的event事件,可以减少引入的mq造成项目扩张,对于不熟悉的人员造成学习成本,有利于项目的快速推进;
但是当复杂业务的时候,或者有类似其他项目业务要同种解耦的场景,依然还是引入mq为主,看场景合适,各取所需吧;

event可以实现一对多,文中的例子, 一个消息,多处消费并处理
event可以实现多对一, 文中的注解可以同时监听多个事件 @EventListener(classes = {A.class, B.class})
event支持事物,当事件处理失败,会回滚

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

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

相关文章

反弹shell bash -i命令

目录 0x01 什么是反弹shell&#xff1f;   0x02 命令拆分详解   0x03 文件描述符   0x04 shell 输入/输出重定向   0x05 输入输出结合获得shell 什么是反弹shell&#xff1f; 假设有两台主机 A(控制端) B(被控端) 正向shell&#xff0c;就是ssh、Telnet的连接&#xf…

YOLOv5源码中的参数超详细解析(4)— 推理部分detect.py

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。YOLOv5是一种先进的目标检测算法&#xff0c;它可以实现快速和准确的目标检测。detect.py是YOLOv5项目目录结构中的一个重要的脚本文件&#xff0c;它用于执行目标检测任务&#xff0c;可以通过命令行参数指定要检测的图像…

【三维重建】Factor Fields: 超越神经场的统一框架

论文&#xff1a;Factor Fields: A Unified Framework for Neural Fields and Beyond 文章&#xff1a;https://arxiv.org/abs/2302.01226 项目&#xff1a;https://apchenstu.github.io/FactorFields/ 文章目录 摘要一、前言二、Factor Fields2.1.字典场&#xff08;DiF&#…

二级MySQL(三)——数据库的增删改查

创建一个新的数据库&#xff1a; CREATE DATABASE db_school DEFAULT CHARACTER SET GB2312 DEFAULT COLLATE GB2312_chinese_ci&#xff1b; 查找创建的数据库&#xff08;全部&#xff09;&#xff1a; 其他的是SQL自带的数据库 查阅我们自己创建的字符集以及对应的字符集…

Qt 实现 360 安全卫士

作者&#xff1a; 一去、二三里 个人微信号&#xff1a; iwaleon 微信公众号&#xff1a; 高效程序员 回想起来&#xff0c;这也算是一个有故事的代码。虽然时间比较久远&#xff0c;但还是记忆犹新。 那就简单说说吧&#xff0c;也不枉费当年的一片心血&#xff01; 说说我的…

java可变字符串

一、常用方法 以StringBuilder为例 1、append(String str) 添加 StringBuilder str new StringBuilder("hello"); System.out.println(str);//在源字符串后添加world StringBuilder add str.append("world"); System.out.println(add);//结果helloworl…

Platypus:Quick,Cheap,and Powerful Refinement of LLMs

Platypus:Quick,Cheap,and Powerful Refinement of LLMs IntroductionMethod2.1 Curating Open- PlatypusRemoving similar&duplicate questionsContamination CheckFine-tuning & mergingResult参考Introduction 现在大模型已经取得很不错的结果,如何把大模型的能…

PL 侧驱动和fpga 重加载的方法

可以解决很多的问题 时钟稳定后加载特定fpga ip &#xff08;要不内核崩的一塌糊涂&#xff09;fpga 稳定复位软件决定fpga ip 加载的时序 dluash load /usr/local/scripts/si5512_setup.lua usleep 30 mkdir -p /lib/firmware cp -rf /usr/local/firmare/{*.bit.bin,*.dtbo} …

css 实现svg动态图标效果

效果演示&#xff1a; 实现思路&#xff1a;主要是通过css的stroke相关属性来设置实现的。 html代码: <svgt"1692441666814"class"icon"viewBox"0 0 1024 1024"version"1.1"xmlns"http://www.w3.org/2000/svg"p-id"…

jps(JVM Process Status Tool):虚拟机进程状况工具

jps&#xff08;JVM Process Status Tool&#xff09;&#xff1a;虚拟机进程状况工具 列出正在运行的虚拟机进程&#xff0c;并显示虚拟机执行主类名称&#xff08;Main Class&#xff0c;main()函数所在的类&#xff09;以及这些进程的本地虚拟机唯一ID&#xff08;LVMID&am…

VMware上搭建的虚拟机突然本地无法连接服务器

长时间没有使用VMware 虚拟机了&#xff0c;今天突然登录上去&#xff0c;启动虚拟服务器后发现本地等不了了&#xff0c; 经过排查发现是开启了&#xff1a;VirtualBox Host-Only Network 关闭之后就本机就可以直连服务器了

java能实现热替换而属性不丢失的原因

1.替换的是klass&#xff0c;数据在oop里面 2.这个没想通说明对java面向对象底层实现不了解。

Midjourney API 申请及使用

在人工智能绘图领域&#xff0c;想必大家听说过 Midjourney 的大名吧&#xff01; Midjourney 以其出色的绘图能力在业界独树一帜。无需过多复杂的操作&#xff0c;只要简单输入绘图指令&#xff0c;这个神奇的工具就能在瞬间为我们呈现出对应的图像。无论是任何物体还是任何风…

linux中shell脚本——shell数组、正则表达式及文件三剑客之AWK

目录 一.shell数组 1.1.数组分类 1.2.定义数组方法 二.正则表达式 2.1.元字符 2.2.表示次数 2.3.位置锚定 2.4.分组 2.5.扩展正则表达式 三.文本三剑客之AWK 3.1.awk介绍及使用格式 3.2.处理动作 3.3.awk选项 3.4.awk处理模式 2.5.awk常见的内置变量 2.6.if条…

5.5.webrtc的线程管理

今天呢&#xff0c;我们来介绍一下线程的管理与绑定&#xff0c;首先我们来看一下web rtc中的线程管理类&#xff0c;也就是thread manager。对于这个类来说呢&#xff0c;其实实现非常简单&#xff0c;对吧&#xff1f; 包括了几个重要的成员&#xff0c;第一个成员呢就是ins…

2021年12月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:我家的门牌号 我家住在一条短胡同里,这条胡同的门牌号从1开始顺序编号。 若所有的门牌号之和减去我家门牌号的两倍,恰好等于n,求我家的门牌号及总共有多少家。 数据保证有唯一解。 时间限制:1000 内存限制:65536 输入 一个正整数n。n < 100000。 输出 一行,包含…

DTC 19服务学习2

紧跟上篇 0x04 reportDTCSnapshotRecordByDTCNumber 通过DTC和快照序列来获取DTC快照记录。 适用以下假设&#xff1a; — 服务器支持存储给定 DTC 的两个 DTCSnapshot 记录的能力。 — 此示例假定是上一个示例的延续。 — 假设服务器请求服务器存储的 DTC 编号 123456 的两个…

【学会动态规划】环绕字符串中唯一的子字符串(25)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…

使用 Amazon Redshift Serverless 和 Toucan 构建数据故事应用程序

这是由 Toucan 的解决方案工程师 Django Bouchez与亚马逊云科技共同撰写的特约文章。 带有控制面板、报告和分析的商业智能&#xff08;BI&#xff0c;Business Intelligence&#xff09;仍是最受欢迎的数据和分析使用场景之一。它为业务分析师和经理提供企业的过去状态和当前状…

尝试自主打造一个有限状态机(一)

前言 我们都知道Unity有自带的有限状态机Animator&#xff0c;它的功能非常强大&#xff0c;为了探索它背后的原理&#xff0c;我开启了这个系列的文章&#xff0c;尝试通过自主打造一个有限状态机来理解Animator的工作原理&#xff0c;同时我会将这个状态机应用于实际&#xf…