Spring中的事件和事件监听器是如何工作的?
目录
一、事件(Event)
二、事件发布器(Event Publisher)
三、事件监听器(Event Listener)
四、使用场景
五、总结
以下是关于Spring中的事件和事件监听器的介绍与使用说明,结合了使用场景:
一、事件(Event)
-
定义:在Spring框架中,事件是对发生在应用程序或Spring上下文中的操作或更改的封装。它可以是Spring框架本身提供的内置事件,也可以是开发者自定义的事件。
-
继承关系:通常,自定义事件类会继承自
ApplicationEvent类,但从Spring Framework 4.2开始,事件类不需要强制继承ApplicationEvent类,可以是任意对象。 -
常见内置事件类型:
- ApplicationStartingEvent:在运行
SpringApplication.run()方法时触发,即应用启动的最早阶段,此时Spring应用上下文还未创建。 - ApplicationReadyEvent:在任何
ApplicationRunner和CommandLineRunner被调用后,且SpringApplication.run()方法即将结束之前触发,表示应用已经准备好接收HTTP请求。 - ContextRefreshedEvent:当
ApplicationContext初始化或刷新完成后触发,通常用于在应用启动后执行初始化任务。 - ContextStartedEvent:当
ApplicationContext启动后触发,用于在应用启动后执行某些操作,如重启服务等。 - ContextStoppedEvent:当
ApplicationContext停止后触发,用于在应用停止后执行清理任务。 - RequestHandledEvent:在Web应用中处理完一个HTTP请求后触发,可用于记录请求处理的时间或进行其他监控操作。
- ApplicationStartingEvent:在运行
二、事件发布器(Event Publisher)
-
功能:负责将事件通知给已注册的事件监听器。在Spring应用中,通常通过注入
ApplicationEventPublisher接口的实现类来完成事件的发布。 -
示例代码:
@Component public class CustomEventPublisher {@Autowiredprivate ApplicationEventPublisher applicationEventPublisher;public void doSomethingAndPublishAnEvent(final String message) {System.out.println("Publishing custom event.");CustomEvent customEvent = new CustomEvent(this, message);applicationEventPublisher.publishEvent(customEvent);} }
三、事件监听器(Event Listener)
-
定义:用于响应事件的发生,对事件进行处理的组件。
-
实现方式:
- 实现ApplicationListener接口:需要重写
onApplicationEvent()方法来处理事件。 - 使用@EventListener注解:可以将一个方法标注为事件监听器,当该方法所在的类被注册为Spring Bean时,该方法就会自动成为事件监听器。
- 实现ApplicationListener接口:需要重写
-
示例代码:
@Component public class CustomEventListener implements ApplicationListener<CustomEvent> {@Overridepublic void onApplicationEvent(CustomEvent event) {System.out.println("Received custom event - " + event.getMessage());} }
四、使用场景
-
数据更新通知:例如,在数据库表中对数据进行插入、更新和删除操作时,可以使用Spring事件机制来通知应用程序中其他的组件及时更新数据缓存或执行相关操作。
-
异步处理:在一些需要异步处理的业务场景中,可以通过Spring事件来触发后台任务的执行,并通过事件监听器来记录任务执行状态、处理异常等。
-
系统日志记录:在系统运行过程中,可以使用Spring事件机制来记录关键事件和异常信息,并将这些信息记录到系统日志中,以便后续的监控和管理。
-
插件化扩展:在支持插件化扩展的系统中,可以使用Spring事件来扩展系统功能,通过发布事件实现插件动态加载,并通过订阅其他系统的事件来响应系统的业务行为。
-
管理事件和通知状态:在应用程序的生命周期中,可以使用Spring Boot提供的事件来记录相关状态,以便后续实现应用程序的监控和管理。
五、总结
Spring中的事件和事件监听器机制为应用程序提供了一种灵活、解耦的通信方式,使得组件之间的交互更加清晰和易于维护。通过合理地运用这一机制,可以显著提升应用程序的可扩展性和可维护性。
相关文章:
Spring中的事件和事件监听器是如何工作的?
目录 一、事件(Event) 二、事件发布器(Event Publisher) 三、事件监听器(Event Listener) 四、使用场景 五、总结 以下是关于Spring中的事件和事件监听器的介绍与使用说明,结合了使用场景&…...
3097. 或值至少为 K 的最短子数组 II
3097. 或值至少为 K 的最短子数组 II 题目链接:3097. 或值至少为 K 的最短子数组 II 代码如下: class Solution { public:int minimumSubarrayLength(vector<int>& nums, int k) {int res INT_MAX;for (int i 0;i < nums.size();i) {in…...
简化配置与动态表达式的 Spring EL
1 引言 在现代软件开发中,配置管理和动态逻辑处理是构建灵活、可维护应用程序的关键。Spring 框架以其强大的依赖注入和面向切面编程功能而闻名,而 Spring Expression Language (Spring EL) 则为开发者提供了一种简洁且强大的方式来简化配置并实现动态表达式。 1.1 Spring …...
erase() 【删数函数】的使用
**2025 - 01 - 25 - 第 48 篇 【函数的使用】 作者(Author) 文章目录 earse() - 删除函数一. vector中的 erase1 移除单个元素2 移除一段元素 二. map 中的erase1 通过键移除元素2 通过迭代器移除元素 earse() - 删除函数 一. vector中的 erase vector 是一个动态数组&#x…...
python实现http文件服务器访问下载
//1.py import http.server import socketserver import os import threading import sys# 获取当前脚本所在的目录 DIRECTORY os.path.dirname(os.path.abspath(__file__))# 设置服务器的端口 PORT 8000# 自定义Handler,将根目录设置为脚本所在目录 class MyHTT…...
在php中怎么打开OpenSSL
(点击即可进入聊天助手) 背景 在使用php做一些项目时,有用到用户邮箱注册等,需要开启openssl的能力 在php系统中openssl默认是关闭状态的,在一些低版本php系统中,有的甚至需要在服务器终端后台,手动安装 要打开OpenSSL扩展,需要进行以下步骤 …...
java构建工具之Gradle
自定义任务 任务定义方式,总体分为两大类:一种是通过 Project 中的task()方法,另一种是通过tasks 对象的 create 或者register 方法。 //任务名称,闭包都作为参数println "taskA..." task(A,{ }) //闭包作为最后一个参数可以直接从括号中拿出来println …...
二次封装的方法
二次封装 我们开发中经常需要封装一些第三方组件,那么父组件应该怎么传值,怎么调用封装好的组件原有的属性、插槽、方法,一个个调用虽然可行,但十分麻烦,我们一起来看更简便的方法。 二次封装组件,属性怎…...
基于Springboot用axiospost请求接收字符串参数为null的解决方案
问题 今天在用前端 post 请求后端时发现,由于是以 Json对象的形式传输的,后端用两个字符串形参无法获取到对应的参数值 前端代码如下: axios.post(http://localhost:8083/test/postParams,{a: 1, b:2} ,{Content-Type: application/jso…...
STM32 OLED屏配置
1.OLED简介 OLED(Organic Light Emitting Diode):有机发光二极管 OLED显示屏:性能优异的新型显示屏,具有功耗低、相应速度快、宽视角、轻薄柔韧等特点 0.96寸OLED模块:小巧玲珑、占用接口少、简单易用&a…...
DiffuEraser: 一种基于扩散模型的视频修复技术
视频修复算法结合了基于流的像素传播与基于Transformer的生成方法,利用光流信息和相邻帧的信息来恢复纹理和对象,同时通过视觉Transformer完成被遮挡区域的修复。然而,这些方法在处理大范围遮挡时常常会遇到模糊和时序不一致的问题࿰…...
策略模式 - 策略模式的使用
引言 在软件开发中,设计模式是解决常见问题的经典解决方案。策略模式(Strategy Pattern)是行为型设计模式之一,它允许在运行时选择算法的行为。通过将算法封装在独立的类中,策略模式使得算法可以独立于使用它的客户端…...
Leetcode40: 组合总和 II
题目描述: 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 代码思路ÿ…...
STM32完全学习——RT-thread在STM32F407上移植
一、写在前面 关于源码的下载,以及在KEIL工程里面添加操作系统的源代码,这里就不再赘述了。需要注意的是RT-thread默认里面是会使用串口的,因此需要额外的进行串口的初始化,有些人可能会问,为什么不直接使用CubMAX直接…...
React应用深度优化与调试实战指南
一、渲染性能优化进阶 1.1 精细化渲染控制 typescript 复制 // components/HeavyComponent.tsx import React, { memo, useMemo } from react;interface Item {id: string;complexData: {// 复杂嵌套结构}; }const HeavyComponent memo(({ items }: { items: Item[] }) &g…...
QT TLS initialization failed
qt使用QNetworkAccessManager下载文件(给出的链接可以在浏览器里面下载文件),下载失败, 提示“TLS initialization failed”通常是由于Qt在使用HTTPS进行文件下载时,未能正确初始化TLS(安全传输层协议&…...
全面了解 Web3 AIGC 和 AI Agent 的创新先锋 MelodAI
不管是在传统领域还是 Crypto,AI 都是公认的最有前景的赛道。随着数字内容需求的爆炸式增长和技术的快速迭代,Web3 AIGC(AI生成内容)和 AI Agent(人工智能代理)正成为两大关键赛道。 AIGC 通过 AI 技术生成…...
Golang之Context详解
引言 之前对context的了解比较浅薄,只知道它是用来传递上下文信息的对象; 对于Context本身的存储、类型认识比较少。 最近又正好在业务代码中发现一种用法:在每个协程中都会复制一份新的局部context对象,想探究下这种写法在性能…...
VSCode+Continue实现AI辅助编程
Continue是一款功能强大的AI辅助编程插件,可连接多种大模型,支持代码设计优化、错误修正、自动补全、注释编写等功能,助力开发人员提高工作效率与代码质量。以下是其安装和使用方法: 一、安装VSCode 参见: vscode安…...
Python 在Word中添加、或删除超链接
在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超链接,用户可以轻松地导航到相关信息,从而增强文档的互动性和可读性。本文将介绍如何使用Python在Word中添加超链接、或删除Word文档中的超…...
Oracle迁移DM数据库
Oracle迁移DM数据库 本文记录使用达梦官方数据迁移工具DTS,将Oracle数据库的数据迁移至达梦数据库。 1 数据准备 2 DTS工具操作步骤 2.1 创建工程 打开DTS迁移工具,点击新建工程,填写好工程信息,如图: 2.2 新建迁…...
Spring Boot整合JavaMail实现邮件发送
一. 发送邮件原理 发件人【设置授权码】 - SMTP协议【Simple Mail TransferProtocol - 是一种提供可靠且有效的电子邮件传输的协议】 - 收件人 二. 获取授权码 开通POP3/SMTP,获取授权码 授权码是QQ邮箱推出的,用于登录第三方客户端的专用密码。适用…...
编辑器Vim基本模式和指令 --【Linux基础开发工具】
文章目录 一、编辑器Vim 键盘布局二、Linux编辑器-vim使用三、vim的基本概念正常/普通/命令模式(Normal mode)插入模式(Insert mode)末行模式(last line mode) 四、vim的基本操作五、vim正常模式命令集插入模式从插入模式切换为命令模式移动光标删除文字复制替换撤销上一次操作…...
K8S极简教程(4小时快速学会)
1. K8S 概览 1.1 K8S 是什么 K8S官网文档:https://kubernetes.io/zh/docs/home/ 1.2 K8S核心特性 服务发现与负载均衡:无需修改你的应用程序即可使用陌生的服务发现机制。存储编排:自动挂载所选存储系统,包括本地存储。Secret和…...
淘宝商品数据解析的应用场景有哪些?
淘宝商品数据解析在多个领域有着广泛的应用场景,以下为你详细介绍: 电商运营与营销 选品分析:通过解析淘宝商品数据,卖家可以了解不同商品的销售情况、价格区间、市场需求热度等信息。例如分析某类商品在不同季节的销量变化&#…...
基于OpenCV实现的答题卡自动判卷系统
一、图像预处理 🌄 二、查找答题卡轮廓 📏 三、透视变换 🔄 四、判卷与评分 🎯 五、主函数 六、完整代码+测试图像集 总结 🌟 在这篇博客中,我将分享如何使用Python结合OpenCV库开发一个答题卡自动判卷系统。这个系统能够自动从扫描的答题卡中提取信…...
计网week1+2
计网 一.概念 1.什么是Internet 节点:主机及其运行的应用程序、路由器、交换机 边:通信链路,接入网链路主机连接到互联网的链路,光纤、网输电缆 协议:对等层的实体之间通信要遵守的标准,规定了语法、语义…...
如何使用tushare pro获取股票数据——附爬虫代码以及tushare积分获取方式
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据 总结 一、Tushare 介绍 Tushare 是一个提供中国股市数据的API接口服务,它允许用户…...
vim的多文件操作
[rootxxx ~]# vim aa.txt bb.txt cc.txt #多文件操作 next #下一个文件 prev #上一个文件 first #第一个文件 last #最后一个文件 快捷键: ctrlshift^ #当前和上个之间切换 说明:快捷键ctrlshift^,…...
Mac m1,m2,m3芯片使用nvm安装node14报错
使用nvm安装了node 12/16/18都没有问题,到14就报错了。第一次看到这个报错有点懵,查询资料发现是Mac芯片的问题。 Issue上提供了两个方案: 1、为了在arm64的Mac上安装node 14,需要使用Rosseta,可以通过以下命令安装 …...
