Spring监听器Listener
目录
1、Spring监听器简介
2、事件(Event)
3、监听器(Listener)
3、事件发布器
4、监听器使用
4.1、自定义事件
4.2、自定义监听器
4.3、发布事件
4.4、测试
4.5、使用注解方式监听
4.6、异步事件处理
5、总结
1、Spring监听器简介
Spring 监听器(Listener)用于监听应用程序中的事件,并在事件发生时执行特定操作。常见的事件包括应用启动、关闭、请求处理等。Spring 提供了多种监听器接口,例如ApplicationListener、ServletRequestListener、HttpSessionListener等,开发者可以通过实现这些接口或者添加对应的注解来监听和处理事件。
2、事件(Event)
在Spring事件顶层类为EventObject抽象类,ApplicationEvent继承了EventObject,是所有事件的基础类,自定义事件需要继承此类。Spring中提供了SpringApplicationEvent,在该类下提供一些实现类。

继承这些类的自定义类都可用作为事件类进行发布,事件通常用于在系统中发生某些操作,通知其他的模块进行一些相应的操作,例如系统启动事件、客户注册系统等。
3、监听器(Listener)
Spring中的监听器ApplicationListener,属于函数式接口,实现该接口的类可用监听特点类型的事件,当检查到特点类型事件时,可用自动进行一些用户开发的操作。
@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {void onApplicationEvent(E event);default boolean supportsAsyncExecution() {return true;}static <T> ApplicationListener<PayloadApplicationEvent<T>> forPayload(Consumer<T> consumer) {return (event) -> {consumer.accept(event.getPayload());};}
}
3、事件发布器
Spring中发布事件的接口ApplicationEventPublisher,用于发布事件。ApplicationContext上下文接口继承了该类,可以发布事件。
@FunctionalInterface
public interface ApplicationEventPublisher {default void publishEvent(ApplicationEvent event) {this.publishEvent((Object)event);}void publishEvent(Object event);
}
4、监听器使用
4.1、自定义事件
创建自定义事件类,自定义事件类需要继承ApplicationEvent。
package com.gs.listener;import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.context.ApplicationEvent;public class CustomEvent extends ApplicationEvent {private String message;public CustomEvent(Object source, String message) {super(source);this.message = message;}public String getMessage(){return this.message;}
}
4.2、自定义监听器
自定义监听器需要实现ApplicationListener接口。
package com.gs.listener;import org.springframework.context.ApplicationListener;@Component
public class CustomEvenListener implements ApplicationListener<CustomEvent> {@Overridepublic void onApplicationEvent(CustomEvent event) {System.out.println("接受客户消息" + event.getMessage());}
}
4.3、发布事件
自定义事件发布器需要实现ApplicationEventPublisher接口
package com.gs.listener;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;@Component
public class CustomEventPublisher {@Autowiredprivate ApplicationEventPublisher publisher;public void publishCustomEvent(String message){System.out.println("发布自定义事件");publisher.publishEvent(new CustomEvent(this,"这是一个自定义测试事件"));}
}
4.4、测试
package com.gs.listener;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class CustomEventTest implements CommandLineRunner {@Autowiredprivate CustomEventPublisher publisher;@Overridepublic void run(String... args) throws Exception {publisher.publishCustomEvent("Hello Spring Event");}
}
运行结果:

4.5、使用注解方式监听
通过在方法上使用@EventListener注解进行监听
package com.gs.listener;import org.springframework.context.ApplicationListener;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;@Component
public class CustomEvenListener {@EventListenerpublic void handleCustomEvent(CustomEvent event) {System.out.println("接受客户消息: " + event.getMessage());}
}
4.6、异步事件处理
默认情况下,Spring事件是同步处理的。如果希望事件处理异步进行,可以使用@Async注解。例如:
package com.gs.listener;import org.springframework.context.ApplicationListener;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;@Component
public class CustomEvenListener {@Async@EventListenerpublic void handleCustomEvent(CustomEvent event) {System.out.println("接受客户消息: " + event.getMessage());}
}
启动类开启异步:
@EnableAsync
@SpringBootApplication
public class DemoProjectApplication {public static void main(String[] args) {SpringApplication.run(DemoProjectApplication.class, args);}}
5、总结
Spring的监听器机制提供了一种灵活的方式来处理应用程序中的事件。通过自定义事件和监听器,可以实现模块之间的解耦,提高代码的可维护性和可扩展性。同时,Spring还提供了注解方式和异步处理的支持,使得事件处理更加方便和高效。
相关文章:
Spring监听器Listener
目录 1、Spring监听器简介 2、事件(Event) 3、监听器(Listener) 3、事件发布器 4、监听器使用 4.1、自定义事件 4.2、自定义监听器 4.3、发布事件 4.4、测试 4.5、使用注解方式监听 4.6、异步事件处理 5、总结 1、Spri…...
【深度学习在图像配准中的应用与挑战】
图像配准在深度学习中的解决方案越来越多,尤其是通过卷积神经网络(CNN)和生成对抗网络(GAN)等方法,可以显著提升图像配准的效果,尤其是在处理复杂的非刚性变换和大范围的图像差异时。 1. 基于深…...
使用 Docker-compose 部署 MySQL
使用 Docker Compose 部署 MySQL 本文将详细指导如何使用 docker-compose 部署 MySQL,包括基本配置、启动步骤、数据持久化以及一些高级选项。通过容器化部署 MySQL,你可以快速搭建一个隔离的数据库环境,适用于开发、测试或小型生产场景。 关…...
blender笔记2
一、物体贴地 物体->变换->对齐物体 ->对齐弹窗(对齐模式:反方,相对于:场景原点,对齐:z)。 之后可以设置原点->原点--3d游标 二、面上有阴影 在编辑模式下操作过后,物体面有阴影。 数据-&g…...
特殊符号_符号图案_特殊符号大全
特殊符号↑返回顶部 © ℗ ร ಗ ย ☫ ౖ ஃ ⁜ ☊ ☋ ❡ ๑ ి ▧ ◘ ▩ ▣ ◙ ▨ ۞ ۩ ಔ ృ ☎ ☏ ⍝ ⍦ ▤ ▥ ▦ ✠ @ ಓ ↂ ూ ☮ ி ﺴ ✈ ✉ ✁ ✎ ✐ 〄 # ‡ ☪ ⌚ ☢ ▪ ▫ ✆ ✑ ✒ ☌ ❢ ▬ ☍ □ ■ ؟ ‼ ‽ ☭ ✏ ⌨…...
Unity学习part4
1、ui界面的基础使用 ui可以在2d和矩形工具界面下操作,更方便,画布与游戏窗口的比例一般默认相同 如图所示,图片在画布上显示的位置和在游戏窗口上显示的位置是相同的 渲染模式:屏幕空间--覆盖,指画布覆盖在游戏物体渲…...
【AI绘画】大卫• 霍克尼风格——自然的魔法(一丹一世界)
大卫• 霍克尼,很喜欢这个老头,“艺术是一场战斗”。老先生零九年有了iphone,开始用iphone画画,一零年开始用ipad画画,用指头划拉,据说五分钟就能画一幅,每天早上随手画几幅送给身边的朋友。很c…...
MySQL日志undo log、redo log和binlog详解
MySQL 日志:undo log、redo log、binlog 有什么用? 一、前言 在MySQL数据库中,undo log、redo log和binlog这三种日志扮演着至关重要的角色,它们各自承担着不同的功能,共同保障了数据库的正常运行和数据的完整性。了解…...
C++中的指针
一.指针的定义 在C中,指针是一种特殊的变量,它存储另一个变量的内存地址。简单的说,指针是指向另一个数据类型的“指针”或“引用”,我们可以通过指针来间接操作其他变量的值。 指针的基本语法: 数据类型 *指针变量名 …...
拆解微软CEO纳德拉战略蓝图:AI、量子计算、游戏革命如何改写未来规则!
2025年2月19日 知名博主Dwarkesh Patel对话微软CEO萨蒂亚纳德拉 在最新访谈释放重磅信号:AI将掀起工业革命级增长,量子计算突破引爆材料科学革命,游戏引擎进化为世界模拟器。 整个视频梳理出几大核心观点,揭示科技巨头的未来十年…...
智能算法如何优化数字内容体验的个性化推荐效果
内容概要 在数字内容体验的优化过程中,个性化推荐系统的核心价值在于通过数据驱动的技术手段,将用户需求与内容资源进行高效匹配。系统首先基于用户行为轨迹分析,捕捉包括点击频次、停留时长、交互路径等关键指标,形成对用户兴趣…...
MATLAB在数据分析和绘图中的应用:从基础到实践
引言 股票数据分析是金融领域中的重要研究方向,通过对历史价格、成交量等数据的分析,可以帮助投资者更好地理解市场趋势和做出决策。MATLAB作为一种强大的科学计算工具,提供了丰富的数据处理和可视化功能,非常适合用于股票数据的…...
AI客服-接入deepseek大模型到微信(本地部署deepseek集成微信自动收发消息)
1.本地部署 1.1 ollama Ollama软件通过其高度优化的推理引擎和先进的内存管理机制,显著提升了大型语言模型在本地设备上的运行效率。其核心采用了量化技术(Quantization)以降低模型的计算复杂度和存储需求,同时结合张量并行计算&…...
Host文件没有配置ip解析,导致请求接口速度慢
Linux访问第三方接口速度慢 现象 在测试环境,Linux的服务器中,要访问第三方接口;速度有时快,有时慢。 有时候第一次访问比较慢,第二次访问比较快。第三方人员,排查之后,第三方接口没有问题&am…...
excel导入Mysql中时间格式异常
问题描述: 当使用xls/xlsx/csv导入mysql中,如果列是时间类型比如excel表中显示2024/02/20 09:18:00,导入后时间可能就会变成1900-01-01 09:18:00这样。 问题原因: 这是由于excel表中和数据库中的时间类型不匹配导致。 问题解决…...
vue 判断一个属性值,如果是null或者空字符串或者是空格没有值的情况下,赋值为--
在 Vue 中,可以通过多种方式来判断一个属性值是否为 null、空字符串或者仅包含空格,如果满足这些条件则将其赋值为 --。下面分别介绍在模板和计算属性、方法中实现的具体做法。 1. 在模板中直接判断 如果只需要在模板中对属性值进行显示处理,…...
JavaWeb-Tomcat服务器
文章目录 Web服务器存在的意义关于Web服务器软件Tomcat服务器简介安装Tomcat服务器Tomcat服务器源文件解析配置Tomcat的环境变量启动Tomcat服务器一个最简单的webapp(不涉及Java) Web服务器存在的意义 我们之前介绍过Web服务器进行通信的原理, 但是我们当时忘记了一点, 服务器…...
vue语法---样式操作-行内样式
文章目录 直接写死的行内样式v-bind绑定对象(静态样式)对象数组 直接写死的行内样式 <template><div v-bind:style"{color:red}">睡觉</div> </template><script>export default{data() {return {}},methods:{}, mounted(){},} </…...
封装一个echarts的组件
父组件页面 <yyjlchartv-if"showyyjl"chartId"yyjllLine":sourceData"sourceDatayyjl":options"optionsyyjl"></yyjlchart>components: {LineEcharts,yyjlchart: () > import("../yyjlchart"),},data() {re…...
计算机网络安全之一:网络安全概述
1.1 网络安全的内涵 随着计算机和网络技术的迅猛发展和广泛普及,越来越多的企业将经营的各种业务建立在Internet/Intranet环境中。于是,支持E-mail、文件共享、即时消息传送的消息和协作服务器成为当今商业社会中的极重要的IT基础设施。然而࿰…...
医疗自动化系统CarePilot的设计与实现
1. 医疗自动化背景与挑战医疗软件生态系统的复杂性远超普通应用场景。在放射科医生的日常工作中,一个典型的影像诊断流程可能涉及:从PACS系统调取DICOM影像→在3D Slicer中调整窗宽窗位→进行器官分割→测量病灶尺寸→生成结构化报告→回传至EMR系统。这…...
终极指南:从实模式到保护模式的内存管理转换
终极指南:从实模式到保护模式的内存管理转换 【免费下载链接】os-tutorial How to create an OS from scratch 项目地址: https://gitcode.com/gh_mirrors/os/os-tutorial 在操作系统开发中,内存管理是核心挑战之一。本教程将带你了解如何从16位实…...
IDM激活脚本终极指南:三步实现永久免费试用下载管理器
IDM激活脚本终极指南:三步实现永久免费试用下载管理器 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager(…...
C语言day3
变量1.变量中的值,可以发生变化的原因。是因为在定义变量的时候,系统会给变量开辟内存空间。2.初始化 含义:在变量内存空间开辟的同时,装入初始值。变量定义后,如果没有给初值的,变量里就存储了随机值。变量…...
ClaudeSkills项目解析:如何通过技能库扩展AI助手能力边界
1. 项目概述:一个为Claude设计的技能库最近在探索AI助手Claude的应用边界时,我遇到了一个非常有意思的项目:kyawshinethu/ClaudeSkills。这本质上是一个GitHub上的开源仓库,但它解决的问题却非常精准——如何让Claude变得更“能干…...
AI代码生成安全防护:从沙箱隔离到静态分析
1. 项目背景与核心挑战在AI辅助编程日益普及的今天,大语言模型(LLM)生成的代码直接执行已成为开发流程中的常见操作。去年参与一个金融系统自动化项目时,我们团队就深刻体会到了这种便利背后的安全隐患——当模型生成的SQL查询语句包含未经验证的动态参数…...
别再说LIN过时了!手把手教你用AUTOSAR MCAL配置LIN驱动(基于EB Tresos实战)
别再说LIN过时了!手把手教你用AUTOSAR MCAL配置LIN驱动(基于EB Tresos实战) 在汽车电子领域,每当讨论车载网络协议时,CAN、FlexRay甚至以太网总是占据话题中心,而LIN总线却常被贴上"过时"或"…...
Rust的闭包中的生成代码
Rust闭包中的生成代码探秘 Rust的闭包是一种强大的语言特性,它允许开发者以简洁的方式捕获环境变量并生成高效的匿名函数。闭包背后的生成代码却隐藏着许多精妙的设计,从类型推断到内存管理,每一步都体现了Rust对性能与安全的极致追求。本文…...
如何3步实现Switch手柄跨平台集成:终极完整指南
如何3步实现Switch手柄跨平台集成:终极完整指南 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode.com/gh_mir…...
Yew行为驱动开发:BDD和Cucumber完整指南
Yew行为驱动开发:BDD和Cucumber完整指南 【免费下载链接】yew Rust / Wasm framework for creating reliable and efficient web applications 项目地址: https://gitcode.com/gh_mirrors/ye/yew Yew是一个基于Rust和WebAssembly的框架,用于创建可…...
