【Spring】Spring之publishEvent

news2025/1/13 10:33:42

观察者模式Spring之publishEvent事件处理

1.使用场景

这个一般什么时候使用,我们一般是在不同的bean直接进行信息传递,比如我们beanA的事件处理完后,需要beanB进行处理一些业务逻辑的时候这种情况就一般可以使用publish-event解决。

可用于操作日志记录

2.原理

ApplicationContext中的事件处理是通过ApplicationEvent类和ApplicationListener接口来提供的,通过ApplicationContext的publishEvent()方法发布到ApplicationListener;。

一个事件模型有三个组成部分:被监听对象source(也称为事件源),事件event和监听对象listener。事件发布者在发布事件的时候->通知事件的监听者。

首先,由监听对象注册监听回调函数(Callback),当事件源触发了事件后,监听对象会收到事件源的信息,然后决定如何对事件源进行处理,简要流程如下图所示。
在这里插入图片描述

3.事件触发 && 监听处理过程

(1) 使用 org.springframework.context 包下的 ApplicationContext.publishEvent(ApplicationEvent appEvent) 发布事件
(2) 使用 org.springframework.context.event 包下的 @EventListener(事件名) 监听事件并处理。

注意:
(1) ApplicationContext.publishEvent 默认是同步操作, 并非发布后不管的异步操作,发布事件后需要等 @EventListener 执行完。
(2) 如果需要开启异步操作需要在@EventListener上增加@Async 注解。

4.代码实现

(1)CustomEvent

/**
 * 用户事件监听
 *
 * @author zhang
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CustomEvent {
    private String message;
}

(2)CustomEventListener

/**
 * @author zhang
 */
@Component
public class CustomEventListener {

    @EventListener(CustomEvent.class)
    public void onApplicationEvent(CustomEvent customEvent) throws InterruptedException {
        System.out.println("监听器接受消息:"+ customEvent.getMessage());
    }
}

(3)CustomController

/**
 * @author zhang
 */
@RestController
public class CustomController {

    @Resource
    private ApplicationContext applicationContext;

    @RequestMapping("/helloListener")
    public String helloListener(){
        System.out.println("模拟执行某业务逻辑A!");
        System.out.println("=======AAA================");
        System.out.println("模拟执行某业务逻辑B-> 即A执行完成后执行业务逻辑B");
        System.out.println("事件开始发布消息!");
        applicationContext.publishEvent(new CustomEvent("你好啊"));
        System.out.println("=======BBB================");
        System.out.println("模拟执行某业务逻辑B执行完毕!");
        return "success";
    }
}

5.执行结果

在这里插入图片描述
在这里插入图片描述

https://blog.csdn.net/jike11231/article/details/124872298

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

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

相关文章

如何将大批量的车辆合格证图片转为excel表格?

之前我们介绍了用金鸣识别在线将车辆合格证转为excel的操作方法,但这种方法有一个局限性,就是网页版仅支持一次性5张图片的识别转换,如果量大,我们需要分为很多次反复地进行转换,会略显繁琐,有没有一种更快…

Linkage Mapper中的局部和全局地图比较

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 文章目录 一、介绍1.1 Linkage Mapper概述二、局部地图2.1 局部地图的定义2.2 局部地图的构建方法

高维向量搜索:在 Elasticsearch 8.X 中利用 dense_vector 的实战探索

近年来,随着深度学习技术的发展,向量搜索引发了人们的广泛关注。早在 Elasticsearch在7.2.0 版本引入了dense_vector字段类型,支持存储高维向量数据,如词嵌入或文档嵌入,以进行相似度搜索等操作。在本文中,…

怎样录屏不带水印?分享一款无水印录制视频软件!

案例:怎样录制无水印的视频? 【我平常录制的录屏带有软件自带水印,这样十分影响观感。怎样才能录制无水印的视频?】 一款好的录屏软件,可以更好地帮助我们录制电脑屏幕上的操作或是制作教学视频。然而,很…

在四维轻云地理空间数据在线管理平台中如何上传、查看及分享数据?

四维轻云是一款地理空间数据在线管理平台,具有地理空间数据的在线管理、展示及分享等功能。在四维轻云平台中,用户可以不受时间地点的限制,随时随地在线浏览激光点云、倾斜摄影模型、正射影像、数字高程模型等地理空间数据。 现在&#xff0…

别样网站呈现方式:无缝衔接视听感受,详细讲述HTML5多媒体标签video和音频标签audio应用实例

video 语法&#xff1a; <video src"文件地址" controls"controls" </video> 常见的属性 属性 值 描 述 autoplay autoplay 视频就绪自动播放&#xff08;谷歌浏览器需要添加muted来解决自动放的问题 controls controls …

批量采集【商品详情+关键词搜索】API接口系列

批量采集【商品详情关键词搜索】API接口系列代码如下&#xff1a; item_get-获得商品详情 公共参数&#xff1a; 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;API 接口请求方式secretString是调用密钥api_nameString是API接口名称&…

深度学习基础入门篇[9.3]:卷积算子:空洞卷积、分组卷积、可分离卷积、可变性卷积等详细讲解以及应用场景和应用实例剖析

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

Qt程序打包和发布

准备工具 1、Qt Creator&#xff0c;记录Qt Creator的安装路径 2、NSIS空白脚本程序和NSIS汉化脚本程 1 Windows下打包与发布 1.1 打包成zip发布 1、通过Qt Creator build应用程序&#xff0c;选择Relaease build的应用程序占用空间少(推荐)&#xff0c;选择Debug build的应用程…

使用 PAI-Blade 优化 Stable Diffusion 推理流程

背景 AIGC是人工智能计算领域里发展迅速的重要业务。Stable Diffusion 是其中最热门的开源模型&#xff0c;受到广泛关注。然而&#xff0c;随着应用场景不断扩大&#xff0c;Stable Diffusion所面临的推理时延和计算成本问题也越来越突出。 简介 PAI-Blade是 PAI 推出的通用…

可视化搭建 - 自动批处理与冻结

性能在可视化搭建也是极为重要的&#xff0c;如何尽可能减少业务感知&#xff0c;最大程度的提升性能是关键。 其实声明式一定程度上可以说是牺牲了性能换来了可维护性&#xff0c;所以在一个完全声明式的框架下做性能优化还是非常有挑战的。我们采取了两种策略来优化性能&…

我的创作纪念日,成为创作者的第256天!

机缘 一年前刚开始学习编程&#xff0c;在网上查找资料的过程中才了解到了CSDN开发者社区。在csdn认识了很多技术大牛&#xff0c;他们的文章记录了他们的学习路径&#xff0c;看到他们从小白一步一步成长为大牛&#xff0c;这激起了我创作的热情。刚开始写博客完全是日常学习…

广域通信网 - HDLC 高级数据链路控制协议

文章目录 1 概述2 HDLC2.1 帧类型2.2 帧结构 3 扩展3.1 网工软考真题 1 概述 #mermaid-svg-JEuFH1qP4tY5jI5p {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JEuFH1qP4tY5jI5p .error-icon{fill:#552222;}#mermaid-…

快看!ChatGPT的4个不为人知却非常实用的小功能

文 / 高扬&#xff08;微信公众号&#xff1a;量子论&#xff09; 今天重点介绍四个ChatGPT很实用的小功能。 一、停止生成 如果在ChatGPT输出内容的过程中&#xff0c;我们发现结果不是自己想要的&#xff0c;可以直接点击“Stop generating”按钮&#xff0c;这样它就会立即停…

小鱼说|城市产业带与供应链系统的结合模式(2)

上一篇讲到城市产业带 的形成以及讲到 它与供应链的关系 那么我们继续把 这个话题深化一下 从原厂地到供应商 到供应链再到商城平台 城市产业带是供货的源地 经过最多二级的供应商上架 到供应链再经过最多二级的 经销商流入到各大商业平台 由于一个供应链可对接多个城市产业带 …

公网远程访问本地jupyter notebook服务 - 内网穿透

文章目录 前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 转载自cpolar的文章&#xff1a;公网远程访问Jupyter Notebook【Cpolar内网穿透】 前言 Jupyter Notebook&am…

ChatGPT为一位英语女教师做了这件事

文 / 高扬&#xff08;微信公众号&#xff1a;量子论&#xff09; 今天有位网友加我微信&#xff0c;是某中学的英语老师&#xff0c;通过“量子论”公众号知晓了ChatGPT的一些有趣玩法&#xff0c;询问是否有办法帮她做个提示词&#xff0c;依据一个单词生成配套学习资料。 即…

代码实战深度理解RabbitMQ 5 种消息模型

5种消息模式 简单消息模式&#xff1a;1个生产者 1个队列 1个消费者&#xff1b;生产者只负责生产&#xff0c;消费者只负责消费&#xff0c;两者在同一个队列中操作工作队列消息模式&#xff1a;1个生产者 1个队列 多个消费者&#xff1b; 一条消息只能被消费一次订阅消息…

AI作曲都这么厉害了,AI生成音乐

人工智能&#xff08;AI&#xff09;正在越来越多地应用于音乐、电影和绘画等艺术领域。在之前海森大数据已经为大家介绍了AI生成绘画&#xff0c;今天带大家了解一下AI生成音乐。 在当下的应用中&#xff0c;AI音乐生成已经相对成熟&#xff0c;AI已经可以影响音乐制作过程的…

annoconda安装使用及镜像源的添加,提高软件下载速度

1 annoconda下载 文件地址列表&#xff0c;选择版本下载https://repo.anaconda.com/archive/ win10版本&#xff1a; Anaconda3-2023.03-1-Windows-x86_64 linux版本&#xff1a; Anaconda3-2023.03-1-Linux-x86_64 win10下执行exe按向导安装&#xff0c;linu…