【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> {

    @Override
    public 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 注解

在这里插入图片描述

本文完结!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【五分钟】学会利用cv2.resize()函数实现图像缩放

引言 在numpy知识库&#xff1a;深入理解numpy.resize函数和数组的resize方法中&#xff0c;小编较为详细地探讨了numpy的resize函数背后的机理。从结果来看&#xff0c;numpy.resize函数并不适合对图像进行缩放操作。而opencv中的resize函数虽然和numpy的resize函数同名&…

html实现动漫视频网站模板源码

文章目录 1.视频设计来源1.1 主界面1.2 动漫、电视剧、电影视频界面1.3 播放视频界面1.4 娱乐前线新闻界面1.5 关于我们界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/detail…

查看网页的cookie

1、打开需要查看的网站&#xff0c;F12 2、点击Network——Doc&#xff0c;选择一项 3、在Request Headers里查找

PyTorch实现逻辑回归

最终效果 先看下最终效果&#xff1a; 这里用一条直线把二维平面上不同的点分开。 生成随机数据 #创建训练数据 x torch.rand(10,1)*10 #shape(10,1) y 2*x (5 torch.randn(10,1))#构建线性回归参数 w torch.randn((1))#随机初始化w&#xff0c;要用到自动梯度求导 b …

【开源】基于Vue和SpringBoot的衣物搭配系统

项目编号&#xff1a; S 016 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S016&#xff0c;文末获取源码。} 项目编号&#xff1a;S016&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣…

深度模型训练时CPU或GPU的使用model.to(device)

一、使用device控制使用CPU还是GPU device torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # 单GPU或者CPU.先判断机器上是否存在GPU&#xff0c;没有则使用CPU训练 model model.to(device) data data.to(device)#或者在确定有GPU的…

python+pytest接口自动化之参数关联

什么是参数关联&#xff1f; 参数关联&#xff0c;也叫接口关联&#xff0c;即接口之间存在参数的联系或依赖。在完成某一功能业务时&#xff0c;有时需要按顺序请求多个接口&#xff0c;此时在某些接口之间可能会存在关联关系。比如&#xff1a;B接口的某个或某些请求参数是通…

TA-Lib学习研究笔记(九)——Pattern Recognition (1)

TA-Lib学习研究笔记&#xff08;九&#xff09;——Pattern Recognition &#xff08;1&#xff09; 0.程序代码 形态识别的函数的应用&#xff0c;通过使用A股实际的数据&#xff0c;验证形态识别函数&#xff0c;用K线显示出现标志的形态走势&#xff0c;由于入口参数基本上…

大学生有担当,乡村振兴新亮点“艺术点亮乡村,创意引领未来”

12月7日上午&#xff0c;由花都区文化馆&#xff08;区非物质文化遗产保护中心&#xff09;指导&#xff0c;广州工商学院主办&#xff0c;广州工商学院国际教育学院承办&#xff0c;花都区文化馆炭步分馆、广州盛美文化传播有限公司协办的广州工商学院国际教育学院视觉传达设计…

C++新经典模板与泛型编程:策略类模板

策略类模板 在前面的博文中&#xff0c;策略类SumPolicy和MinPolicy都是普通的类&#xff0c;其中包含的是一个静态成员函数模板algorithm()&#xff0c;该函数模板包含两个类型模板参数。其实&#xff0c;也可以把SumPolicy和MinPolicy类写成类模板—直接把algorithm()中的两…

C/C++,树算法——二叉树的插入、移除、合并及遍历算法之源代码

1 文本格式 #include<iostream>; using namespace std; // A BTree node class BTreeNode { int* keys; // An array of keys int t; // Minimum degree (defines the range for number of keys) BTreeNode** C; // An array of child pointers …

SAP FICO S_ALR_87013611 报表列宽度的调整

如何去调整&#xff1f; 选中对应的列 菜单-设置-列属性 连起来

十一、了解分布式计算

1、什么是&#xff08;数据&#xff09;计算&#xff1f; 2、分布式(数据)计算 &#xff08;1&#xff09;概念 顾名思义&#xff0c;分布式计算&#xff0c;即以分布式的形式完成数据的统计&#xff0c;得到需要的结果。 分布式数据计算&#xff0c;顾名思义&#xff0c;就是…

idea开发环境配置

idea重新安装后&#xff0c;配置的东西还挺多的&#xff0c;这里简单记录一下。 1、基础配置 1.1、主题、背景、主题字体大小 1.2、默认字体设置 控制台默认编码设置&#xff1a; 全局文件默认编码设置&#xff1a; 2、构建、编译、部署配置 说明&#xff1a;本地装了JD…

【Java基础篇 | 面向对象】—— 聊聊什么是接口(下篇)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 上篇&#xff08;【Ja…

学习Linux(1)-开始前的准备

一、Linux介绍 如图,“Linux的发行版说简单点就是将Linux内核与应用软件做一个打包”&#xff0c;所以&#xff0c;我们要学习Linux&#xff0c;就要选择一个趁手的应用软件&#xff0c;通常使用较多的有centerOs、Ubuntu。本文将基于centerOs6进行学习。 二、安装环境 使用Li…

认识线程和创建线程

目录 1.认识多线程 1.1线程的概念 1.2进程和线程 1.2.1进程和线程用图描述关系 1.2.2进程和线程的区别 1.3Java 的线程和操作系统线程的关系 2.创建线程 2.1继承 Thread 类 2.2实现 Runnable 接口 2.3匿名内部类创建 Thread 子类对象 2.4匿名内部类创建 Runnable 子类对…

SAP UI5 walkthrough step7 JSON Model

这个章节&#xff0c;帮助我们理解MVC架构中的M 我们将会在APP中新增一个输入框&#xff0c;并将输入的值绑定到model&#xff0c;然后将其作为描述&#xff0c;直接显示在输入框的右边 首先修改App.controllers.js webapp/controller/App.controller.js sap.ui.define([&…

教师需要什么技能?

作为一名老师&#xff0c;需要掌握许多技能&#xff0c;以便能够成功地教育和指导学生。以下是一些关键技能&#xff1a; 1.教学技能&#xff1a;老师需要有深入的学科知识和教学经验&#xff0c;以便能够有效地传授知识。教师应该了解如何设计和执行教学计划&#xff0c;制定课…

Java、JDK、JRE、JVM

Java、JDK、JRE、JVM 一、 Java 广义上看&#xff0c;Kotlin、JRuby等运行于Java虚拟机上的编程语言以及相关的程序都属于Java体系的一员。从传统意义上看&#xff0c;Java社区规定的Java技术体系包括以下几个部分&#xff1a; Java程序设计语言各种硬件平台上的Java虚拟机实…