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

【SpringBoot】解析Springboot事件机制,事件发布和监听

解析Springboot事件机制,事件发布和监听

  • 一、Spring的事件是什么
  • 二、使用步骤
    • 2.1 依赖处理
    • 2.2 定义事件实体类
    • 2.3 定义事件监听类
    • 2.4 事件发布
  • 三、异步调用
    • 3.1 启用异步调用
    • 3.2 监听器方法上添加 @Async 注解

一、Spring的事件是什么

Spring的事件监听(也叫事件驱动)(Application Event)为Bean与Bean之间的消息通信提供了支持,是观察者模式的一种实现,只要是观察者模式,就含有主题(针对该主题的事件),发布者(发布主题或事件),订阅者(监听主题的人)。有三个部分组成,事件(ApplicationEvent)、监听器(ApplicationListener)和事件发布操作。

它的作用:使用事件机制我们可以将相互耦合的代码解耦,从而方便功能拓展和调整。

事件机制中有三种角色:发布事件者、事件、事件监听者

  • 发布事件者:发布事件的对象
  • 事件:事件的具体内容
  • 事件监听者:等待处理时间的对象

二、使用步骤

2.1 依赖处理

SpringBoot相应的依赖已经包含在 context 包了,所以我们使用的时候不需要在 pom.xml 文件中再单独添加。如图所示:

在这里插入图片描述

2.2 定义事件实体类

事件类需要继承 ApplicationEvent 类

示例:定义一个报警事件,属性是报警实体类,也可以是其他字段或者实体根据业务自定义

package com.example.demozmq.event;import org.springframework.context.ApplicationEvent;/*** 定义一个报警事件,属性是报警实体类*/
public class AlarmEvent extends ApplicationEvent {private PfsAlarm pfsAlarm;public AlarmEvent(Object source, PfsAlarm pfsAlarm) {super(source);this.pfsAlarm = pfsAlarm;}public PfsAlarm getPfsAlarm() {return pfsAlarm;}
}

2.3 定义事件监听类

事件监听类,实现 ApplicationListener 接口,泛型是<自定义的事件实体类>

package com.example.demozmq.listener;import com.example.demozmq.event.AlarmEvent;
import java.util.concurrent.TimeUnit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class AlarmListener implements ApplicationListener<AlarmEvent> {@Overridepublic void onApplicationEvent(AlarmEvent alarmEvent) {log.info(">>>>>>>>>>>>>>>>>>>  执行事件监听开始,调用参数是:{}", alarmEvent.getPfsAlarm());try {// 此处是执行具体的业务处理逻辑TimeUnit.SECONDS.sleep(100);log.info(">>>>>>>>>>>>>>>>>>> 执行具体的任务完成!");} catch (Exception e) {e.printStackTrace();}log.info(">>>>>>>>>>>>>>>>>>> 执行事件监听结束");}
}

如下图所示实际的应用示例:

在这里插入图片描述

2.4 事件发布

以下两处皆为事件发布,只是不同业务而已,可以参照哈

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

三、异步调用

3.1 启用异步调用

在这里插入图片描述

3.2 监听器方法上添加 @Async 注解

在这里插入图片描述

本文完结!

相关文章:

【SpringBoot】解析Springboot事件机制,事件发布和监听

解析Springboot事件机制&#xff0c;事件发布和监听 一、Spring的事件是什么二、使用步骤2.1 依赖处理2.2 定义事件实体类2.3 定义事件监听类2.4 事件发布 三、异步调用3.1 启用异步调用3.2 监听器方法上添加 Async 注解 一、Spring的事件是什么 Spring的事件监听&#xff08;…...

华为ensp实验——基于全局地址池的DHCP组网实验

目录 前言实验目的实验内容实验结果 前言 该实验基于华为ensp&#xff0c;版本号是1.3.00.100 V100R003C00SPC100&#xff0c;只供学习和参考&#xff0c;不作任何商业用途。 具体的DHCP命令可以看系列文章链接&#xff0c;计算机网络实验&#xff08;华为eNSP模拟器&#xff…...

如何选择一款安全可靠的跨网安全数据交换系统?

随着网络和数据安全的重视程度增加&#xff0c;为了有效地保护内部的核心数据资产&#xff0c;普遍会采用内外网隔离的策略。像国内的政府机构、金融、能源电力、航空航天、医院等关乎国计民生的行业和领域均已进行了网络的隔离&#xff0c;将内部划分成不同的网段&#xff0c;…...

基于c++版本的数据结构改-python栈和队列思维总结

##栈部分-&#xff08;叠猫猫&#xff09; ##抽象数据类型栈的定义&#xff1a;是一种遵循先入后出的逻辑的线性数据结构。 换种方式去理解这种数据结构如果我们在一摞盘子中取到下面的盘子&#xff0c;我们首先要把最上面的盘子依次拿走&#xff0c;才可以继续拿下面的盘子&…...

算法通关村第七关—迭代实现二叉树的遍历(黄金)

迭代实现二叉树的遍历 迭代法实现前序遍历 前序遍历是中左右&#xff0c;如果还有左子树就一直向下找。完了之后再返回从最底层逐步向上向右找。不难写出如下代码&#xff1a;&#xff08;注意代码中&#xff0c;空节点不入栈&#xff09; public List<Integer>preorde…...

Java期末复习题之封装

点击返回标题->23年Java期末复习-CSDN博客 第1题. 定义一个类Person,定义name和age私有属性&#xff0c;定义有参的构造方法对name和age进行初始化。在测试类中创建该类的2个对象&#xff0c;姓名、年龄分别为lili、19和lucy、20&#xff0c;在屏幕打印出2个对象的姓名和年龄…...

湖科大计网:计算机网络概述

一、计算机网络的性能指标 一、速率 有时候数据量也认为是以10为底的&#xff0c;看怎么好算。&#xff08;具体吉大考试用什么待商榷&#xff09; 二、带宽 在模拟信号系统中带宽的含义&#xff0c;本课程中用到的地方是&#xff1a;香农定理和奈奎斯特定理公式的应用之中。 …...

每日一道c语言

任务描述 题目描述:输入10个互不相同的整数并保存在数组中&#xff0c;找到该最大元素并删除它&#xff0c;输出删除后的数组 相关知识&#xff08;略&#xff09; 编程要求 请仔细阅读右侧代码&#xff0c;结合相关知识&#xff0c;在Begin-End区域内进行代码补充&#xf…...

(C)一些题11

1. #include<stdio.h> #include<string.h> void main() { char *s1"ABCDEF"&#xff0c;*s2"aB"&#xff1b; s1; s2; puts(s1)&#xff1b; puts(s2)&#xff1b; printf("%d\n",strcmp(s1,s2))&#xff1b; } 答案&#xff1…...

多级路由component页面不加载

项目基于vue-element-admin 新建SubView.vue <template><router-view /> </template><script setup> </script>在父层添加component {path: /sj,component: Layout,redirect: /sj,name: 三级医院评审标准(2022),meta: {title: 三级医院评审标准(…...

【原创】Mac mini M1安装home-brew

Mac mini M1 所需神器 home-brew 按照官网的脚本无法安装。 无奈&#xff0c;从github下载安装包来安装。 Homebrew 结果&#xff0c;还需要先安装 Xcode command 命令行工具 xcode-select --install安装完了&#xff0c;却无法执行。 修改配置文件 cd vi .zshrc添加如下内…...

【python交互界面】实现动态观察图像在给定HSV范围的区域显示

HSV颜色空间 与RGB颜色空间相比&#xff0c;HSV颜色空间更适合进行颜色分析和提取特定颜色的目标。在HSV空间中&#xff0c;颜色信息被分布在不同的通道上&#xff0c;使我们能够更准确地定义颜色的范围&#xff0c;并使用阈值操作轻松地分离出我们感兴趣的区域部分。 HSV三个通…...

Vue3中定义变量是选择ref还是reactive?

目录 ref和reactive的优势 1. ref 优势&#xff1a; 应用场景&#xff1a; 示例&#xff1a; 2. reactive 优势&#xff1a; 应用场景&#xff1a; 示例&#xff1a; ref和reactive的劣势 1. ref 2. reactive 应用案例 总结 Vue3中定义变量可以选择使用ref或reac…...

数据结构 | 查漏补缺之哈希表、最短路径、二叉树与森林的转换

哈希表是什么&#xff1f; 或者说 设图采用邻接表的存储结构&#xff0c;写对图的删除顶点和删除边的算法步骤 删除边 删除点 最短路径问题 参考博文 迪杰斯特拉(Dijkstra)算法_dijkstra算法-CSDN博客 Dijkstra(迪杰斯特拉&#xff09;算法 定义一个点为源点&#xff0c;算源…...

SpringCloud

五大组件 注册/配置中心 Nacos 、Eureka远程调用 Feign负载均衡 Ribbon服务保护 sentinel&#xff08;实现限流、降级、熔断&#xff09;网关 gateway 注册中心 Eureka 服务注册&#xff1a;服务提供者把自己的信息注册到Eureka&#xff0c;由Eureka来保存这些信息服务发现…...

fastadmin嵌套关联查询,thinkPHP5嵌套关联查询

fastadmin嵌套关联查询 thinkPHP5嵌套关联查询 笔记记录 嵌套关联查询 A -> B -> C A 表关联B表 B表关联C表 同时把A&#xff0f;B&#xff0f;C表相关的数据展现出来 B表的model B表关联C表 我的C表是B表的自身关联。也是一个表&#xff0c;所以为C表 namespace app…...

Power BI - 5分钟学习拆分列

每天5分钟&#xff0c;今天介绍Power BI拆分列功能。 什么是拆分列&#xff1f; 有时导入Power BI的数据表中&#xff0c;某列内容都包含同样的特殊字符如 /&/-/_等&#xff0c;可以利用这个特殊字符进行拆分列的操作&#xff0c;获得我们想要的信息。 操作举例&#xf…...

ELK(四)—els基本操作

目录 elasticsearch基本概念RESTful API创建非结构化索引&#xff08;增&#xff09;创建空索引&#xff08;删&#xff09;删除索引&#xff08;改&#xff09;插入数据&#xff08;改&#xff09;数据更新&#xff08;查&#xff09;搜索数据&#xff08;id&#xff09;&…...

【100天精通Python】Day75:Python机器学习-第一个机器学习小项目_鸾尾花分类项目(上)

目录 1 机器学习中的Helloworld _鸾尾花分类项目 2 导入项目所需类库和鸾尾花数据集 2.1 导入类库 2.2 scikit-learn 库介绍 &#xff08;1&#xff09;主要特点&#xff1a; &#xff08;2&#xff09;常见的子模块&#xff1a; 3 导入鸾尾花数据集 3.1 概述数据 3.…...

gitlab高级功能之容器镜像仓库

今天给大家介绍一个gitlab的高级功能 - Container Registry&#xff0c;该功能可以实现docker镜像的仓库功能&#xff0c;将gitlab上的代码仓的代码通过docker构建后并推入到容器仓库中&#xff0c;好处就是无需再额外部署一套docker仓库。 文章目录 1. 参考文档2. Container R…...

DeepSeek流式响应提速73%的底层逻辑:从Token缓冲区到GPU显存调度的全链路拆解

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek流式响应提速73%的工程现象与性能基线 在真实生产环境中对 DeepSeek-R1 模型实施流式响应优化后&#xff0c;端到端首 token 延迟&#xff08;Time to First Token, TTFT&#xff09;从平均 482ms 降至…...

AI Agent在DevOps中的应用:自主监控、根因分析与故障修复

AI Agent在DevOps中的应用&#xff1a;自主监控、根因分析与故障修复 引言 痛点引入&#xff1a;现代DevOps团队的“三座大山” 想象一个场景&#xff1a;周五晚上23:58&#xff0c;你正准备关掉电脑奔赴周末的露营烧烤局&#xff0c;手机突然弹出数十条Prometheus、ELK Sta…...

使用Taotoken CLI工具一键配置多开发环境与工具密钥

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Taotoken CLI工具一键配置多开发环境与工具密钥 基础教程类&#xff0c;面向需要在不同机器或为不同工具&#xff08;如OpenCl…...

深度解析sguard_limit:ACE-Guard内核级资源限制器的架构设计与性能优化

深度解析sguard_limit&#xff1a;ACE-Guard内核级资源限制器的架构设计与性能优化 【免费下载链接】sguard_limit 限制ACE-Guard Client EXE占用系统资源&#xff0c;支持各种腾讯游戏 项目地址: https://gitcode.com/gh_mirrors/sg/sguard_limit 在腾讯游戏生态中&…...

工具调用失效?DeepSeek官方未公开的3个隐式约束条件,90%开发者至今仍在硬编码绕过

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;工具调用失效&#xff1f;DeepSeek官方未公开的3个隐式约束条件&#xff0c;90%开发者至今仍在硬编码绕过 DeepSeek-R1 模型虽开放了 tools 调用接口&#xff0c;但其底层推理引擎对工具参数存在三类未…...

【DeepSeek推理加速实战指南】:20年AI系统优化专家亲授7大低开销部署技巧

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek推理加速的核心挑战与优化全景 DeepSeek系列大模型在实际部署中面临显著的推理延迟与显存压力&#xff0c;尤其在长上下文&#xff08;如32K tokens&#xff09;和高并发场景下&#xff0c;GPU利用率常…...

Zotero文献去重插件:高效清理重复文献的完整解决方案

Zotero文献去重插件&#xff1a;高效清理重复文献的完整解决方案 【免费下载链接】ZoteroDuplicatesMerger A zotero plugin to automatically merge duplicate items 项目地址: https://gitcode.com/gh_mirrors/zo/ZoteroDuplicatesMerger 在学术研究过程中&#xff0c…...

trae之mcp服务初体验 完美实现某视频请求头参数x-ca-sign值逆向

问题提问: 请通过 MCP 服务分析 https://m.yichengwlkj.com/pc?channel=CHANNEL_USK 网站中的 https://api.rrmj.plus/m-station/app/page?position=CHANNEL_USK&pageNum=1&personalRecommend=0 请求链接。该请求的请求头中包含一个名为 x-ca-sign 的参数,该参数的…...

植物大战僵尸修改器终极指南:如何快速掌握PvZ Toolkit提升游戏体验

植物大战僵尸修改器终极指南&#xff1a;如何快速掌握PvZ Toolkit提升游戏体验 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 你是否在玩植物大战僵尸时遇到过阳光不够用、金币积累太慢的烦恼&…...

BabelDOC:如何用结构化中间语言实现PDF格式无损翻译?

BabelDOC&#xff1a;如何用结构化中间语言实现PDF格式无损翻译&#xff1f; 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC 在学术研究和跨国协作中&#xff0c;PDF文档翻译一直是一个技术难题…...