当前位置: 首页 > news >正文

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):当一个请求被处理完成时发布事件。

相关文章:

  • DL专栏—笔记目录
  • 1.C语言——基础知识
  • LeetCode-135】分发糖果(贪心)
  • CMake+QT+大漠插件的桌面应用开发(QThread)
  • 使用vue2写一个太极图,并且点击旋转
  • postman测试导入文件
  • 多协议转换网关BL120ML实现Modbus、楼宇自控、电力协议转Modbus
  • html + css + js简单的项目
  • 项目工程下载与XML配置文件下载:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十)
  • python元类为类的全部方法添加装饰器
  • 2017年认证杯SPSSPRO杯数学建模B题(第二阶段)岁月的印记全过程文档及程序
  • #《AI中文版》V3 第 1 章 概述
  • linux之安装配置VM+CentOS7+换源
  • 如何通过系统命令排查账号安全?
  • 智慧文旅运营综合平台:重塑文化旅游产业的新引擎
  • 【Leetcode】101. 对称二叉树
  • 《剑指offer》分解让复杂问题更简单
  • 4. 路由到控制器 - Laravel从零开始教程
  • co.js - 让异步代码同步化
  • ES6核心特性
  • Github访问慢解决办法
  • HTTP请求重发
  • JavaScript 基本功--面试宝典
  • JavaScript对象详解
  • JS基础之数据类型、对象、原型、原型链、继承
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • Xmanager 远程桌面 CentOS 7
  • 批量截取pdf文件
  • 普通函数和构造函数的区别
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 云大使推广中的常见热门问题
  • 走向全栈之MongoDB的使用
  • Android开发者必备:推荐一款助力开发的开源APP
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​io --- 处理流的核心工具​
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (145)光线追踪距离场柔和阴影
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (二)构建dubbo分布式平台-平台功能导图
  • (四)c52学习之旅-流水LED灯
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (译)2019年前端性能优化清单 — 下篇
  • (正则)提取页面里的img标签
  • (转)创业的注意事项
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET 发展历程
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .net连接MySQL的方法
  • /var/log/cvslog 太大
  • @property python知乎_Python3基础之:property