Spring事件发布ApplicationEventPublisher原理

借鉴:https://blog.csdn.net/zxfhahaha/article/details/112558429
https://blog.csdn.net/qq_46940224/article/details/131043987
https://blog.csdn.net/weixin_37672801/article/details/128803430
https://www.cnblogs.com/shamo89/p/15715091.html
https://blog.csdn.net/laohuangaa/article/details/119772453

Spring事件发布原理(ApplicationEventPublisher接口)

1.事件发布的使用:

事件驱动机制其实是观察者模式(又称发布订阅)具体实现,事件对象(HtwBikeRoadSignEvent)相当于被观察对象, 事件监听(EventListener) 相当于观察者。@EventListener()括号里面是哪个对象就是监听哪个对象。

HtwBikeRoadSignAction.java: 自己定义的类,在方法中发布事件

@Service
public class HtwBikeRoadSignAction implements AssetInBoundAction {@Autowiredprivate HtwBikeRepository htwBikeRepository;@Resourceprivate ApplicationContext applicationContext;@Resourceprivate CityExtInfoIntegrationService cityExtInfoIntegrationService;@Autowiredprivate AssetAddressAndStatusConvertManager convertManager;@Overridepublic AssetsInBoundResult apply(AssetContext context, AssetsInBoundParam param) {AssetsInBoundResult assetsResult = new AssetsInBoundResult();List<Long> bikeIds = Collections.emptyList();bikeIds.add(12245L);List<HtwBikeEntity> htwBikeEntityList = htwBikeRepository.getByIds(bikeIds);HtwBikeRoadSignEvent htwBikeRoadSignEvent = HtwBikeRoadSignEvent.builder().context(context).htwBikeEntities(htwBikeEntityList).build();//更新车辆信息modifyHtwBikeInfo(context, htwBikeEntityList);*/// 5.发送车辆绑定事件applicationContext.publishEvent(htwBikeRoadSignEvent);assetsResult.setInBoundResult(true);return assetsResult;}
}

HtwBikeRoadSignEvent.java:

/*** 路面签收事件*/
@Data
@Builder
public class HtwBikeRoadSignEvent extends AssetSopEvent {/*** 操作上下文*/private AssetContext context;/*** 车辆信息*/private List<HtwBikeEntity> htwBikeEntities;/*** 车辆更新字段*/private Map<String,Object> bikeUpdateMap;/*** 锁更新字段*/private Map<String,Object> lockUpdateMap;
}

HtwBikeRoadSignSrmHandler.java:

/*** 车辆路面签收通知*/
@Component
public class HtwBikeRoadSignSrmHandler {@Value("${srm.producer.topic}")private String                  srmGatewayTopic;/*@Resource(name = "exporterBlocMessageProducer")private BlocMessageProducerImpl producer;*/@Async@EventListener(HtwBikeRoadSignEvent.class)public void onRoadSign(HtwBikeRoadSignEvent event) {AssetContext context = event.getContext();List<HtwBikeEntity> htwBikeEntities = event.getHtwBikeEntities();AssetChangeOrderMessageDTO assetChangeOrderMessageDTO = new AssetChangeOrderMessageDTO();assetChangeOrderMessageDTO.setChangeType(1);//producer.sendMessage(srmGatewayTopic, assetChangeOrderMessageDTO);}}@Async 添加注解表示这个方法要异步执行

2.Spring的两种监听器的实现有两种方式:

实现ApplicationListener接口 :方法是onApplicationEvent(E event);
注解@EventListener

3.原理: 待自己补充:TODO ,先看这个里面的有源码贴图: https://www.cnblogs.com/shamo89/p/15715091.html 或者 https://blog.csdn.net/laohuangaa/article/details/119772453

4.观察者模式:

包含观察者和目标(被观察者)两种对象。目标和观察者之间存在一对多的关系,通过建立目标与观察者之间的联系,当目标的某个状态发生变化时,所有与之关联的观察者都会得到通知并执行各自的任务。

也称 发布-订阅模式:
订阅:观察者向目标对象注册自己,告诉目标对象自己在观察它。
发布:当目标对象的状态发生改变时,向它所有的观察者发送通知,观察者收到通知后执行各自的操作。

优点:降低了目标与观察者之间的耦合关系。
缺点:目标与观察者之间没有完全解耦,还可能出现循环引用;当观察者对象很多时,通知的发布可能会很耗时。

5.Spring5种标准事件: Spring源码中也是用了事件发布,下面的是监听对象即事件

上下文更新事件(ContextRefreshedEvent): ApplicationContext初始化或刷新,或者说在容器实例化(refresh())时发布事件;
上下文开始事件(ContextStartedEvent):Spring容器启动时,即调用ConfigurableApplicationContext接口的start()时发布事件;
上下文停止事件(ContextStoppedEvent):Spring容器停止时,即调用ConfigurableApplicationContext接口的stop()时发布事件,关闭的容器可以通过start()重启;
上下文关闭事件(ContextClosedEvent):Spring容器关闭时,即调用ConfigurableApplicationContext接口的close()时发布事件,所有的Bean已被销毁,无法重启容器;
请求处理事件(RequestHandledEvent):当一个请求被处理完成时发布事件。

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

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

相关文章

科技、文化与旅游的融合创新:智慧文旅的未来之路

在当今社会&#xff0c;科技、文化与旅游的融合已经成为文旅产业转型升级的重要趋势。这种融合不仅有助于提升文旅产业的核心竞争力&#xff0c;更有助于推动产业的数字化转型和可持续发展。 本文将深入探讨科技、文化与旅游的融合创新&#xff0c;以及智慧文旅场景的解决方案…

【C++语言1】基本语法

前言 &#x1f493;作者简介&#xff1a; 加油&#xff0c;旭杏&#xff0c;目前大二&#xff0c;正在学习C&#xff0c;数据结构等&#x1f440; &#x1f493;作者主页&#xff1a;加油&#xff0c;旭杏的主页&#x1f440; ⏩本文收录在&#xff1a;再识C进阶的专栏&#x1…

代码+视频R语言绘制逆概率加权后的基线表

基于 PS &#xff08;倾向评分&#xff09;的逆概率加权(IPTW )法首先由&#xff32;osenbaum作为一种以模型为基础的直接标准化法提出&#xff0c;属于边际结构模型。简单来说&#xff0c;就是把许多协变量和混杂因素打包成一个概率并进行加权&#xff0c;这样的话&#xff0c…

【GoLang入门教程】Go语言工程结构详述

程序员裁员潮&#xff1a;技术变革下的职业危机 文章目录 程序员裁员潮&#xff1a;技术变革下的职业危机前言总结:专栏集锦强烈推荐写在最后 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网…

3d音响按键怎么建立模型---模大狮模型网

要建立3D音响按键的模型&#xff0c;您可以按照以下步骤进行&#xff1a; 选择建模软件&#xff1a;首先&#xff0c;选择一个三维建模软件&#xff0c;如Blender、3ds Max或Maya。这些软件都提供了丰富的建模工具和功能&#xff0c;适合用于创建复杂的三维模型。 参考图像&am…

java SSM自助快递服务平台myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM自助快递服务平台是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

DophineScheduler通俗版

1.DophineScheduler的架构 ZooKeeper&#xff1a; AlertServer&#xff1a; UI&#xff1a; ApiServer&#xff1a; 一个租户下可以有多个用户&#xff1b;一个用户可以有多个项目一个项目可以有多个工作流定义&#xff0c;每个工作流定义只属于一个项目&#xff1b;一个租户可…

人工智能原理实验4(2)——贝叶斯、决策求解汽车评估数据集

&#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1; 汽车数据集 车子具有 buying,maint,doors,persons,lug_boot and safety六种属性&#xff0c;而车子的好坏分为uncc,ucc,good and vgood四种。 &#x1f9e1;&#x1f9e1;贝叶斯求解&#x1f9e1;&#x1f9e1;…

Redis——RDB持久化

前言 Redis是一个键值对数据库服务器&#xff0c;服务器中通常包含任意个非空数据库&#xff0c;而每个非空数据库中又可以包含任意个键值对&#xff0c;为了方便起见&#xff0c;我们将服务器中的非空数据库以及它们的键值对统称为数据库状态。 因为Redis数据库是内存数据库&a…

Java/Python/Go不同开发语言在进程、线程和协程的设计差异

Java/Python/Go不同开发语言在进程、线程和协程的设计差异 1. 进程、线程和协程上的差异1.1 进程、线程、协程的定义1.2 进程、线程、协程的差异1.3 进程、线程、协程的内存成本1.4 进程、线程、协程的切换成本 2. 线程、协程之间的通信和协作方式2.1 python如何实现线程通信&a…

大模型实战营Day6 笔记

本期主题为&#xff1a; 为何测评&#xff0c;因场景众多&#xff0c;需要统一的标准&#xff1a; 评测的意义&#xff1a; 传统NLP的一些评测需要&#xff1a; 到了大模型时代&#xff0c;需要评测的就更多了&#xff1a; 客观评测&#xff1a; 有些主观题可以用模型评价…

cdh6.3.2的hive配udf

背景 大数据平台的租户要使用udf&#xff0c;他们用beeline连接&#xff0c; 意味着要通过hs2&#xff0c;但如果有多个hs2&#xff0c;各个hs2之间不能共享&#xff0c;需要先把文件传到hdfs&#xff0c;然后手动在各hs2上create function。之后就可以永久使用了&#xff0c;…

docker配置node项目

首先在项目根目录创建Dockerfile FROM node:18.19RUN mkdir /appCOPY . /appWORKDIR /appRUN npm installEXPOSE 8081CMD ["npm","run","start"]添加.dockerignore文件 /dist /node_moduleslogs *.log npm-debug.log* yarn-debug.log* yarn-er…

从零开始的OpenGL光栅化渲染器构建3-法线贴图和视差贴图

前言 我们可以用一张纹理贴图来表现物体表面的基础反射颜色&#xff0c;也可以用一张镜面反射贴图&#xff0c;来指派表面是否产生高光。除此之外&#xff0c;我们可以用贴图来存储表面的法线信息&#xff0c;以及高度信息&#xff0c;从而让渲染效果更加精细。 法线贴图 我…

通过浏览器URL地址,5分钟内渗透你的网站!很刑很可拷!

今天我来带大家简单渗透一个小破站&#xff0c;通过这个案例&#xff0c;让你深入了解为什么很多公司都需要紧急修复各个中间件的漏洞以及进行URL解析拦截等重要操作。这些措施的目的是为了保护网站和系统的安全性。如果不及时升级和修复漏洞&#xff0c;你就等着被黑客攻击吧&…

【LeetCode209】 长度最小的子数组

209. 长度最小的子数组 滑动窗口型双指针 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;…

浮点数详解

目录 1.概述 2.浮点数的编码方式 2.1.float类型的IEEE编码 2.2.double类型的IEEE编码 2.3.现场问题 2.4.总结 1.概述 计算机也需要运算和存储数学中的实数。在计算机的发展过程中&#xff0c;曾产生过多种存储实数的方式&#xff0c;有的现在已经很少使用了。不管如何存储…

HBase学习五:运维排障之宕机恢复

1 简介 HBase系统中主要有两类服务进程:Master进程以及RegionServer进程。Master主要负责集群管理调度,在实际生产线上并没有非常大的压力,因此发生软件层面故障的概率非常低。RegionServer主要负责用户的读写服务,进程中包含很多缓存组件以及与HDFS交互的组件,实际生产线…

LeetCode 48 旋转图像

题目描述 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4…

Vue.js 3 项目开发:迈向现代化前端开发的必经之路

文章目录 一、Vue.js 3简介二、Vue.js 3新特性1. Composition API2. 更好的性能3. 更好的TypeScript支持4. 更多的生命周期钩子5. 更好的自定义指令API 三、Vue.js 3项目开发实践1. 搭建开发环境2. 项目结构规划3. 组件开发4. 路由管理5. 状态管理6. 测试与部署 《Vue.js 3企业…