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

spring监听事件

1、spring-监听事件基本原理

  • Spring的事件监听机制和发布订阅机制是很相似的:发布了一个事件后,监听该类型事件的所有监听器会触发相应的处理逻辑

2、Spring 监听事件相关规范

在Spring中,事件监听机制主要涉及到了一下几个关键的规范(抽象类及接口):ApplicationEventApplicationListener ApplicationEventPublisher

  • ApplicationEvent: Spring的事件是符合jdk的规范的,这个抽象类继承了jdk内置的事件规范类EventObject(即jdk建议所有的事件都继承EventObject这个类)。ApplicationEvent是Spring家的事件规范。所以我们在自定义事件的时候,可以继承与ApplicationEvent,比如,Spring家自己关于容器上下文事件就又定义了一个容器上下文的时间规范ApplicationContextEvent,它同样是继承于ApplicationEvent的,只不过扩充了获取发出事件容器的方法;今后,我们同样可以在继承于ApplicationEvent的基础上定义自己的事件规范。

  • ApplicationListener:这是一个函数式接口,同样时事件监听器的规范,当监听到自己监听的事件类型时就会调用onApplicationEvent方法来执行监听逻辑

  • ApplicationEventPublisher:这同样是一个函数式接口,定义了事件发布的规范,任何的事件发布器ApplicationEventPublisher都是通过调用publishEvent来进行事件的发布

3、代码实现-自定事件

public class MyEvent extends ApplicationEvent {private user user;//注册方法也行。list<> 集合,对象public MyEvent(Object source, user user) {super(source);this.user = user;}public user getMessage() {return user;}
}

定义一个user实体类

@Data
public class user {
private String name;
private String age;}

4、监听事件

  • springboot进行事件监听有四种方式,选择任意一种即可
  • 将监听器装载入spring容器(常用)
  • 通过@EventListener注解实现事件监听(常用)
  • 手工向ApplicationContext中添加监听器
  • 在application.properties中配置监听器
  • 4.1、 监听–ApplicationListener
@Component
@Slf4j
public class MyListener1 implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent event) {//写自己的方法log.info("{}监听器1:监听到事件{}",MyListener1.class.getName(),event.getMessage());System.out.println("---------------------->监听器1:监听到事件");}
}
  • 4.2、 监听–注释
@Component
@Slf4j
public class MyListener2 {@EventListener(value = MyEvent.class)@Asyncpublic void listener(MyEvent event) {//写自己的方法log.info("{}监听器1:监听到事件{}", MyListener2.class.getName(),event.getMessage());System.out.println("---------------------->监听器1:监听到事件");}
}
  • 4.3、监听–配置文件
通过配置文application.properties中配置监听器: context.listener.classes=com.listener.MyListener1
  • 4.4、监听–手动添加监听
@SpringBootApplication
public class SpringListenerApplication {public static void main(String[] args) {ConfigurableApplicationContext run = SpringApplication.run(SpringListenerApplication.class, args);// 添加监听器run.addApplicationListener(new MyListener1());}}

5、发布事件

//使用 applicationContext  和ApplicationEventPublisher  都可以发布事件,人选则其一即可。
@RestController
@RequestMapping("/my")
public class MyController {@Autowiredprivate ApplicationContext applicationContext;//@Autowired//  private ApplicationEventPublisher applicationEventPublisher;@RequestMapping("/test")public void test() {user user = new user();user.setName("GJ");user.setAge("12");System.out.println(applicationContext.getApplicationName());applicationContext.publishEvent(new MyEvent(this,user));//    applicationEventPublisher.publishEvent(new MyEvent(this,user));}}
//直接访问即可

6、工作中使用 ----发布者模式

@Component
public class ApplicationContextUtil implements ApplicationContextAware{private static ApplicationContext applicationContext;private ApplicationContextUtil() {}public static <T> T getBean(Class<T> clazz) throws BeansException{return applicationContext.getBean(clazz);}public static void publishEvent(Object event){;applicationContext.publishEvent(event);}public static ApplicationContext getApplicationContext(){return applicationContext;}@Overridepublic void setApplicationContext(ApplicationContext context) throws BeansException {applicationContext = context;}}
  • 6.1、添加 NoticeDto 类对MyEvent进行继承
@Data
public class NoticeDto extends MyEvent{private String noticeType;public NoticeDto(Object source) {super(source);}
}
@Data
public class MyEvent extends ApplicationEvent {private String message;//ApplicationEvent 需要有参的构造,所以必须调用superpublic MyEvent(Object source) {super(source);}
}
  • 6.2、监听器
@Component
@Slf4j
public class MyListener3 {@EventListener@Async//当然这个地方也可以使用NoticeDto  作为参数。public void listener(MyEvent event) {
//        假设 MyEvent 是 NoticeDto 的父类或接口,并且某个 MyEvent 类型的对象 event 实际上是 NoticeDto 的一个实例。
//        当这个对象被传递给 listener 方法时,它仍然保持着其作为 NoticeDto 实例的所有属性和值。
//        在方法内部,通过 (NoticeDto) event 进行向下转型,将这个对象视为 NoticeDto 类型,从而可以访问 NoticeDto 特有的属性和方法。
//        由于对象的内部状态在转换过程中没有改变,所以 NoticeDto 的属性会保留其原有的值。 总的来说,转换类型并没有改变对象的实际内容,只是改变了我们与对象交互的方式。
//        因此,NoticeDto 中的属性在转换后仍然保持其原有的值。NoticeDto event1 = (NoticeDto) event;//写自己的方法log.info("{}监听器:监听到事件{}", MyListener3.class.getName(),event.getMessage());System.out.println("---------------------->监听器:监听到事件");System.out.println(event.getMessage()+"\n"+event.getSource().getClass().getName());System.out.println(event1.getNoticeType());System.out.println(event1.getMessage());}
}
  • 6.3、访问测试:
    @RequestMapping("/test2")public void test2() {//不管怎么写,都会被监听,但必须传送一个 object source,传送什么无所谓。NoticeDto noticeDto = new NoticeDto(this);noticeDto.setNoticeType("123");noticeDto.setMessage("abc");ApplicationContextUtil.publishEvent(noticeDto);}
}
//结果为:
2024-07-09 23:43:57.180  INFO 8100 --- [nio-8888-exec-1] com.example.listener.MyListener3         : com.example.listener.MyListener3监听器:监听到事件abc
---------------------->监听器:监听到事件
abc
com.example.listener.MyController
123
abc

相关文章:

spring监听事件

1、spring-监听事件基本原理 Spring的事件监听机制和发布订阅机制是很相似的&#xff1a;发布了一个事件后&#xff0c;监听该类型事件的所有监听器会触发相应的处理逻辑 2、Spring 监听事件相关规范 在Spring中&#xff0c;事件监听机制主要涉及到了一下几个关键的规范&#x…...

微软发布E2 TTS: 一种简单但效果优秀的文本转语音技术

本文介绍了一种名为“Embarrassingly Easy Text-to-Speech&#xff08;E2 TTS&#xff09;”的文本转语音系统。 该系统通过将输入文本转换为填充标记字符序列&#xff0c;并基于音频填充值任务训练流匹配基mel频谱生成器&#xff0c;实现了人类水平的自然度和最先进的说话人相…...

python爬虫加入进度条

安装tqdm和requests库 pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simplepip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple带进度条下载 import time # 引入time模块&#xff0c;用于处理时间相关的功能 from tqdm import * # 从tqdm包中…...

力扣844.比较含退格的字符串

力扣844.比较含退格的字符串 栈模拟 class Solution {public:bool backspaceCompare(string s, string t) {int n s.size(),m t.size();stack<char> s1,s2;for(int i0;i<n;i){s1.push(s[i]);if(s[i] #){if(s1.size() 1) s1.pop();else s1.pop(),s1.pop();}}for(i…...

用户特征和embedding层做Concatenation

要将用户特征与嵌入层进行连接&#xff0c;可以使用深度学习框架&#xff08;如TensorFlow或PyTorch&#xff09;中的基本操作。以下是使用PyTorch的示例代码&#xff0c;展示了如何将用户特征与嵌入层连接起来。 示例代码&#xff08;使用PyTorch&#xff09; 安装 PyTorch 如…...

Ubuntu20.04下修改samba用户密码

Ubuntu20.04下修改samba用户密码 在Ubuntu系统中&#xff0c;修改samba密码通常涉及到两个方面&#xff1a;更改samba用户的密码和重置samba服务的密码数据库。以下是如何进行操作的步骤&#xff1a; 1、更改samba用户密码&#xff1a; 打开终端&#xff0c;使用以下命令更改…...

PHP老照片修复文字识别图像去雾一键抠图微信小程序源码

&#x1f50d;解锁复古魅力&#xff0c;微信小程序黑科技大揭秘&#xff01;老照片修复&更多神奇功能等你来试&#xff01; &#x1f4f8; 【老照片修复&#xff0c;时光倒流的美颜术】 你是否珍藏着一堆泛黄的老照片&#xff0c;却因岁月侵蚀而模糊不清&#xff1f;现在…...

识别色带详解解释

这段代码主要用于检测图像中的绿色区域&#xff0c;并在检测到特定数量的绿色像素时采取相应的动作。下面是每行代码的详细解释&#xff1a; if (divergerColor "green") {目的: 检查当前 divergerColor 是否为 “green”。如果是&#xff0c;则进入代码块进行绿色…...

如何用 Python 绕过 cloudflare(5秒盾) 抓取数据:也不是很难嘛!

大家好!我是爱摸鱼的小鸿,关注我,收看每期的编程干货。 逆向是爬虫工程师进阶必备技能,当我们遇到一个问题时可能会有多种解决途径,而如何做出最高效的抉择又需要经验的积累。本期文章将以实战的方式,带你全面了解 cloudflare(5秒盾) 以及如何绕过使用 cloudflare 服务…...

掌握Conda配置术:conda config命令的深度指南

掌握Conda配置术&#xff1a;conda config命令的深度指南 引言 Conda是一个功能强大的包管理器和环境管理器&#xff0c;广泛用于Python和其他科学计算语言的依赖管理。conda config命令是Conda套件中用于配置和自定义Conda行为的关键工具。通过这个命令&#xff0c;用户可以…...

MySQL:left join 后用 on 还是 where?

在MySQL中&#xff0c;LEFT JOIN用于返回左表&#xff08;即LEFT JOIN关键字左边的表&#xff09;的所有记录&#xff0c;即使在右表中没有匹配的记录。对于那些右表中没有匹配的记录&#xff0c;结果集中右表的部分会被填充为NULL。关于ON和WHERE子句的使用&#xff0c;它们在…...

openfoam生成的非均匀固体Solid数据分析、VTK数据格式分析、以及paraview官方用户指导文档和使用方法

一、openfoam生成的非均匀固体Solid数据分析 二、VTK数据格式分析 三、paraview官方用户指导文档和使用方法 官网文档链接&#xff1a;在paraview软件中&#xff0c;点击工具栏中的help->paraview guide 即可直接跳转到浏览器打开官网指导页面。 官网链接如下&#xff1a;…...

JVM:类的生命周期

文章目录 一、介绍二、加载阶段三、连接阶段1、验证阶段2、准备阶段3、解析阶段 四、初始化阶段 一、介绍 类的生命周期描述了一个类加载、连接&#xff08;验证、准备和解析&#xff09;、初始化、使用、卸载的整个过程。 二、加载阶段 加载&#xff08;Loading&#xff09…...

几种不同的方式禁止IP访问网站(PHP、Nginx、Apache设置方法)

1、PHP禁止IP和IP段访问 <?//禁止某个IP$banned_ip array ("127.0.0.1",//"119.6.20.66","192.168.1.4");if ( in_array( getenv("REMOTE_ADDR"), $banned_ip ) ){die ("您的IP禁止访问&#xff01;");}//禁止某个IP段…...

经典 SQL 数据库笔试题及答案整理

最近有蛮多小伙伴在跳槽找工作&#xff0c;但对于年限稍短的软件测试工程师&#xff0c;难免会需要进行笔试&#xff0c;而在笔试中&#xff0c;基本都会碰到一道关于数据库的大题&#xff0c;今天这篇文章呢&#xff0c;就收录了下最近学员反馈上来的一些数据库笔试题&#xf…...

JS代码动态打印404页面源码

JS代码动态打印404页面源码&#xff0c;适合做网站错误页&#xff0c;具有js动态打印效果&#xff0c;喜欢的朋友可以拿去 源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务…...

从“钓”到“管”:EasyCVR一体化视频解决方案助力水域安全管理

一、背景 随着城市化进程的加快&#xff0c;越来越多的市民热衷于钓鱼活动。钓鱼活动在带来乐趣的同时&#xff0c;也伴随着一定的安全隐患。尤其是在一些危险水域&#xff0c;也经常出现垂钓者的身影&#xff0c;非法垂钓&#xff0c;这给城市管理带来了不小的阻力。传统的人…...

springboot大学生竞赛管理系统-计算机毕业设计源码37276

摘 要 随着教育信息化的不断发展&#xff0c;大学生竞赛已成为高校教育的重要组成部分。传统的竞赛组织和管理方式存在着诸多问题&#xff0c;如信息不透明、效率低下、管理不便等。为了解决这些问题&#xff0c;提高竞赛组织和管理效率&#xff0c;本文设计并实现了一个基于Sp…...

提高LabVIEW软件的健壮性

提高LabVIEW软件的健壮性&#xff0c;即增强其在各种操作条件下的可靠性和稳定性&#xff0c;是开发过程中非常重要的一环。健壮的软件能够在面对意外输入、极端环境和系统故障时依然表现出色&#xff0c;确保系统的连续性和可靠性。以下是详细的方法和策略&#xff0c;从多个角…...

不同深度的埋点事件如何微妙地改变广告系列的成本

/ 作者简介 / 本篇文章来自现金贷领域市场投放大佬 亮哥 的投稿&#xff0c;主要分享了在广告投放过程中&#xff0c;不同深度的埋点事件如何微妙地改变广告系列的成本的相关经验&#xff0c;相信会对大家有所帮助&#xff01;同时也感谢作者贡献的精彩文章。 / 前言 …...

Perl 语言进阶学习

Perl 语言进阶学习 在掌握 Perl 的基础知识后&#xff0c;进一步学习 Perl 的高级特性和应用&#xff0c;将有助于提升编程效率和解决复杂问题的能力。本文将详细介绍 Perl 语言的高级功能、最佳实践以及实际应用案例。 目录 高级数据结构 多维数组复杂数据结构 引用与匿名数…...

el-input-number @input.native触发,修改值失效

试过在方法里用this.$set()、this.$next(()>{})没生效 解决方案&#xff1a;如下...

这些实用工具函数都撕不明白还敢说自己是高级前端

很多工具函数大家都知道,比如防抖函数,节流函数,深拷贝函数等,一问都会,一写就废,用lodash的掘友们,是不是基本功都退化了?CV工程师请不要把基本功给弄丢了,下面我来整理一下项目中常用的工具函数,多练练吧,不然面试现场写不出来多丢人啊! 1.防抖函数 /*** 防抖函…...

git 如何查看 commit 77062497

在Git中&#xff0c;要查看特定commit&#xff08;如77062497&#xff09;的详细信息&#xff0c;你可以使用git show命令。如果77062497是一个完整的commit哈希值&#xff08;在Git中&#xff0c;commit哈希值通常是40位的十六进制数&#xff09;&#xff0c;你可能需要输入完…...

纯CSS瀑布流

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>瀑布流布局</title> <style>/* 瀑布…...

vue3 路由跳转新页面并传递参数与获取参数

打开新标签页面传递参数&#xff08;useRouter &#xff09; import { useRouter } from vue-router const uRouter useRouter() let page uRouter.resolve({path:/mapRollerShutter,query:{type:Split,key:1}})window.open(page.href,_blank)页面接收&#xff08;useRoute …...

NSAT-8000电源检测软件测试砖式电源模块的方案及优势

砖式电源模块类型 砖式电源&#xff0c;顾名思义其外观尺寸像块砖&#xff0c;具有体积小、功率大、安装方便等特点。砖式电源模块具备高可靠性和高稳定性&#xff0c;能够为设备提供稳定的电力输出&#xff0c;在通信、工业、医疗等领域广泛应用。 根据尺寸大小&#xff0c;砖…...

短链接服务Octopus-搭建实战

[WARNING] The POM for cn.throwx:octopus-contract:jar:1.0-SNAPSHOT is missing, no dependency information available 解决方案&#xff1a; cd octopus-contract/ mvn install -------------- ➜ octopus-server git:(master) ✗ mkdir -p /data/log-center/octopus/s…...

STM32(二):STM32工作原理

0、参考1、寄存器和存储器基本概念&#xff08;1&#xff09;基本概念&#xff08;2&#xff09;主要区别&#xff08;3&#xff09;联系&#xff08;4&#xff09;实际应用中的案例&#xff08;5&#xff09;总结&#xff08;6&#xff09;一些名词解释 2、STM32指南者板子-存…...

真实工作项目Java使用apache.poi生成word

加油&#xff0c;新时代打工人&#xff01; 将实体类利用poi转成Word文件 demo示例 package com.fqpais.util;import com.fqpais.business.domain.TestReportTemplate; import com.fqpais.common.utils.StringUtils; import org.apache.poi.xwpf.usermodel.*; import org.slf4…...

温州自助模板建站/百度网站提交入口

MovieClip.attachMovie 语法&#xff1a; anyMovieClip.attachMovie(idName, newname, depth); 参数&#xff1a; idName 要绑定的库中Movie的名字。这个名字就是元素的Linkage Properties对话框中输入的标识名。 newname 就是被绑定MC的实体名&#xff0c;必须是唯一的。 dept…...

动画型网站/培训心得体会200字

如何为窗体应用程序显示控制台 周银辉 由于某种特殊需求&#xff08;⊙﹏⊙&#xff09;&#xff0c;需要将窗体应用程序的控制台输出显示出来&#xff0c;其实是为了显示Console.Write()信息以便调试哈&#xff08;VS的output窗口是可以显示的&…...

网络营销平台搭建方案网站/网页广告调词平台多少钱

1. 概述 最近开始学习自定义View&#xff0c;看到现在公司项目上的一个动画效果&#xff0c;顿时想到其实可以自己画&#xff0c;于是就开始着手优&#xff08;zhuang&#xff09;化&#xff08;bi&#xff09;这个动画。 动画如下&#xff1a; 其实很简单对不对&#xff0c;但…...

哪些网站可以找到做海报的素材/百度导航最新版本免费下载

写在前面 是这样的&#xff0c;我们现在接口使用了Ocelot做网关&#xff0c;Ocelot里面集成了基于IdentityServer4开发的授权中心用于对Api资源的保护。问题来了&#xff0c;我们的Api用了SwaggerUI做接口的自文档&#xff0c;那就蛋疼了&#xff0c;你接入了IdentityServer4的…...

做亚马逊网站费用吗/苏州网站优化公司

点击跳转Python笔记总目录 Python面向对象之异常处理 一、错误与异常 二、异常处理 三、什么时候用异常处理 一、错误与异常 程序中难免会出现错误&#xff0c;而错误分为两种 1.语法错误&#xff1a;&#xff08;这种错误&#xff0c;根本过不了python解释器的语法检测&#x…...

公司建设网站的费用/网址提交百度收录

展开全部写的乱七八糟的,不错就怪了.给你改好了.package changepassword;import java.util.Scanner;public class Administrator{String name;//姓名String password;//密码String inputpass;//判断是否正确的密码String newpassword;//再次输入密码String repassword;//第2输入…...