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

Spring Event学习

Spring Event学习

观察者模式是一种行为设计模式,它定义了对象之间的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。在这个模式中,改变状态的对象被称为主题,依赖的对象被称为观察者。

为什么要使用Spring Event

1、业务解耦:比如给注册成功的用户发送短信通知,正常情况下我们可能会在service中去写这个发送短信通知的代码,但是如果用户注册有多个场景,每个场景都去调一次发送短信通知的代码略显繁杂,而且注册业务和发送短信通知的业务耦合了;这时就可以使用Spring Event进行处理,在注册成功后发布一个用户注册成功的事件,然后在监听器中去统一发送短信通知;
2、底层模块给上层模块发送通知:如果项目本身依赖了自己开发的其它模块,那么业务模块如何拿到底层模块的信息呢?这时也可以使用Spring Event进行处理。

Spring Event使用

非注解

创建事件对象。这里要注意的是从Spring Framework4.2开始,ApplicationEventPublisher接口为 publishEvent(Object event)方法提供了新的重载,该方法接受任何对象作为事件。因此,Spring 事件不再需要扩展ApplicationEvent 类。

public class MyEvent extends ApplicationEvent {private String message;public MyEvent(Object source) {super(source);}public MyEvent(Object source, String message) {super(source);this.message = message;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

事件发布者,发布事件需要调用Spring提供的ApplicationEventPublisher的publishEvent方法。

@Component
public class MyEventPublisher {@Autowiredprivate ApplicationEventPublisher eventPublisher;public void publishMyEvent(String message) {System.out.println("message: " + message);MyEvent myEvent = new MyEvent(this, "test meaage");//发布事件,发布给在监听的任何人eventPublisher.publishEvent(myEvent);}
}

事件监听。事件监听可以通过实现ApplicationListener来实现。

@Component
public class MyEventListener implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent event) {System.out.println("recieve message: " + event.getMessage());}
}

在业务中发布事件,这里写了一个controller,当访问这个接口时会发送事件,事件监听者会收到事件通知。

@RestController
@RequestMapping("/test")
public class MyController {@Autowiredprivate MyEventPublisher eventPublisher;@RequestMapping("/test1")public String test1() {eventPublisher.publishMyEvent("test1");return "test1";}
}

注解

从 Spring4.2开始,事件侦听器可以不实现ApplicationListener接口,使用@EventListener注解即可。

使用注解的事件监听者示例如下:

@Component
public class AnnotationDrivenEventListener {@EventListenerpublic void handleContextStart(ContextStartedEvent cse) {System.out.println("Handling context started event.");}
}

默认情况下监听器是同步的,可以通过在方法上使用@Async注解来开启异步。

Spring 框架提供的事件

ContextRefreshed事件

在初始化或刷新ApplicationContext时,Spring 会引发 ContextRefreshedEvent。通常,只要上下文尚未关闭,刷新就会被多次触发。另外还可以调用ConfigurableApplicationContext接口的refresh方法来手动触发事件。

ContextStarted事件

通过在 ConfigurableApplicationContext 上调用start方法,我们触发此事件并启ApplicationContext。事实上,该方法通常用于在显式停止后重新启动 bean。我们还可以使用该方法来处理没有自动启动配置的组件。在这里,需要注意的是,对 start的调用始终是显式的,而不是refresh。

ContextStopped事件

当 ApplicationContext 停止时,通过调用 ConfigurableApplicationContext上的stop方法,将发布 ContextStoppedEvent。我们可以使用 start方法重新启动停止的事件。

ContextClosed事件

此事件在 ApplicationContext 关闭时使用 ConfigurableApplicationContext 中的 close方法发布。
实际上,在关闭上下文后,我们无法重新启动它。上下文在关闭它时会达到其生命周期的终点。

示例代码

监听指定的事件

@EventListener
public void handleContextRefreshEvent(ContextStartedEvent ctxStartEvt) {System.out.println("Context Start Event received.");
}

同时监听多个事件

@Component
public class MyContextStartListener {@EventListener(classes = {ContextStartedEvent.class, ContextClosedEvent.class,ContextStoppedEvent.class, ContextRefreshedEvent.class})public void handleContextStart(ApplicationContextEvent event) {System.out.println("Handling context started event.");}}

参考

  1. Spring高手之路7——事件机制与监听器的全面探索
  2. Spring Events
  3. Spring Application Context Events

相关文章:

Spring Event学习

Spring Event学习 观察者模式是一种行为设计模式&#xff0c;它定义了对象之间的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都会得到通知并被自动更新。在这个模式中&#xff0c;改变状态的对象被称为主题&#xff0c;依赖的对象被称为观…...

UE4 HLSL学习笔记

在Custom配置对应ush文件路径 在HLSL中写入对应代码 Custom里面增加两个Input&#xff0c;名字必须和ush文件内的未知变量名字一样 然后就对应输出对应效果的颜色 这就是简单的加法运算 减法同理&#xff1a; 乘法除法同理 HLSL取最小值 HLSL取最大值 绝对值&#xff1a; 取余…...

报文的路由过程

路由转发过程 记住路由转发过程结论&#xff1a;报文ip是不变&#xff0c;mac改变。 mac地址在同一个广播域传输过程中是不变的&#xff1b;在跨越广播域的时候会发生改变的&#xff1b;而IP地址在传输过程中是不会改变的&#xff08;除NAT的时候&#xff09;。 ip地址本质上是…...

【CPP】类和对象

1- Classes and Objects Structures A struct in C is a type consisting of a sequence of data membersSome functions/Statements are needed to operate the data members of an object of a struct type 不不小心操作错误&#xff0c;不小心越界 Classes You should b…...

【多线程面试题二十】、 如何实现互斥锁(mutex)?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;如何实现互斥锁&#xf…...

hypercube背景设置为白色,绘制高光谱3D立方体

import scipy pip install wxpython PyOpenGL和Spectral需要本地安装 可参考链接https://blog.csdn.net/qq_43204333/article/details/119837870 参考&#xff1a;https://blog.csdn.net/Tiandailan/article/details/132719745?spm1001.2014.3001.5506Mouse Functions:left-cl…...

Visual Studio(VS)C++项目 管理第三方依赖库和目录设置

发现很多程序员存在这种做法&#xff1a;把项目依赖的第三方库的lib和dll放在项目目录下&#xff0c;或者复制到输出目录&#xff0c;因为每种配置都有不同的输出目录&#xff0c;所以要复制多份&#xff08;至少包括Debug和Release两个输出目录&#xff09;&#xff0c;这些做…...

leetCode 2578. 最小和分割 + 排序 + 贪心 + 奇偶分组(构造最优解)

2578. 最小和分割 - 力扣&#xff08;LeetCode&#xff09; 给你一个正整数 num &#xff0c;请你将它分割成两个非负整数 num1 和 num2 &#xff0c;满足&#xff1a; num1 和 num2 直接连起来&#xff0c;得到 num 各数位的一个排列。 换句话说&#xff0c;num1 和 num2 中所…...

自定义实现图片裁剪

要实现这个功能&#xff0c;首先需要创建一个自定义的View&#xff0c;然后在该View中绘制背景框和裁剪后的图片。以下是一个简单的实现&#xff1a; 1. 创建一个名为CustomImageView的自定义View类&#xff0c;继承自View&#xff1a; import android.content.Context; impor…...

开发语言工具编程系统化教程入门和初级专辑课程上线

开发语言工具编程系统化教程入门和初级专辑课程上线 学习编程捷径&#xff1a;&#xff08;不论是正在学习编程的大学生&#xff0c;还是IT人士或者是编程爱好者&#xff0c;在学习编程的过程中用正确的学习方法 可以达到事半功倍的效果。对于初学者&#xff0c;可以通过下面…...

【Truffle】二、自定义合约测试

一、准备测试 上期我们自己安装部署了truffle&#xff0c;并且体验了测试用例的整个测试流程&#xff0c;实际开发中&#xff0c;我们可以对自己的合约进行测试。 我们首先先明白自定义合约测试需要几个文件 合约文件&#xff1a;既然要测试合约&#xff0c;肯定要有合约的源码…...

场景交易额超40亿,海尔智家三翼鸟开始收获

文 | 螳螂观察 作者 | 余一 随着双十一的到来&#xff0c;国内的消费情绪再次被点燃。在这类大促之下&#xff0c;品牌们就像一个个天体&#xff0c;不断引动着市场潮汐&#xff0c;期待自己能触发更大的“海潮效应”。 所谓“海潮效应”是指&#xff0c;海水因天体的引力而…...

众和策略可靠吗?股票扛杆怎么玩?

可靠 股票扛杆是一种出资战略&#xff0c;经过假贷资金来增加出资金额&#xff0c;从而进步出资收益。这种战略在股票商场中被广泛运用&#xff0c;但一起也伴随着一定的危险。在本文中&#xff0c;咱们将从多个视点来剖析股票扛杆怎么玩。 首要&#xff0c;扛杆出资的原理是…...

解决连接Mysql出现ERROR 2013 (HY000): Lost connection to MySQL server at ‘waiting

在上一篇中解决Mysql ER_ACCESS_DENIED_ERROR: Access denied for user ‘root‘‘localhost‘ (using password: YES)-CSDN博客 写了mysql的密码报错问题&#xff0c;在执行 mysql -u root -p 出现了这个错误&#xff0c; ERROR 2013 (HY000): Lost connection to MySQL se…...

Hadoop YARN功能介绍--资源管理、调度任务

Hadoop YRAN介绍 YARN是一个通用资源管理系统平台和调度平台&#xff0c;可为上层应用提供统一的资源管理和 调度。 他的引入为集群在利用率、资源统一管理和数据共享等方面带来了好处。 1.资源管理系统 集群的硬件资源&#xff0c;和程序运行无关&#xff0c;比如内存、cu…...

从AlexNet到chatGPT的演进过程

一、演进 AlexNet&#xff08;2012&#xff09;&#xff1a; AlexNet是深度学习领域的重要突破&#xff0c;包括5个卷积层和3个全连接层。使用ReLU激活函数和Dropout正则化&#xff0c;获得了ImageNet图像分类比赛的胜利。引入了GPU加速训练&#xff0c;大幅提高了深度神经网络…...

Unity如何实现bHaptics TrackSuit震动衣的SDK接入

前言 TrackSuit是bHaptisc公司旗下的一款震动衣,包括X16,X40等不同型号,是一款尖端的无线高级触觉背心,采用人体工程学设计,具有40个精确的触觉反馈点。通过无缝的跨平台支持和无限制、无滞后的游戏体验,增强您的VR冒险体验。用于PC或者VR游戏中高度还原真实射击触感。官…...

识别flink的反压源头

背景 flink中最常见的问题就是反压&#xff0c;这种情况下我们要正确的识别导致反压的真正的源头&#xff0c;本文就简单看下如何正确识别反压的源头 反压的源头 首先我们必须意识到现实中轻微的反压是没有必要去优化的&#xff0c;因为这种情况下是由于偶尔的流量峰值,Task…...

Spring是如何解决bean循环依赖的问题的

在Spring框架中&#xff0c;循环依赖是指两个或多个Bean之间相互依赖&#xff0c;形成了一个闭环的依赖关系。当存在循环依赖时&#xff0c;Bean的创建过程会陷入死循环&#xff0c;导致应用程序无法启动或出现异常。 说到循环依赖&#xff0c;首先我先说说bean的三级缓存 在S…...

[移动通讯]【Carrier Aggregation-9】【 Radio Resource Control (RRC) Aspects】

前言&#xff1a; CA 分析辅助工具&#xff1a; UE Capabilities 目录&#xff1a; 总体流程 Radio Resource Control (RRC) Aspects SCell addition and removal Handover 一 总体流程 1.1 CA 总体流程 1.2 CA 和 NSA 区别 NSA 我理解也是一种特殊的CA 方案&…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...