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

【Springboot】事件机制发布与订阅的使用实践

文章目录

    • 为什么要使用事件监听机制
    • 概念和原理
    • 使用场景
    • 用户注册系统实践案例
      • 1. 创建事件类
      • 2. 发布事件
      • 3. 监听事件
        • 3.1 通过注解@EventListener实现监听
        • 3.2 通过实现ApplicationListener接口实现监听
      • 4. 测试事件机制
    • 总结

为什么要使用事件监听机制

在Springboot中,事件机制(Event Mechanism)是一种强大的工具,用于解耦组件之间的通信。通过事件机制,组件可以通过发布和监听事件来进行交互。本文将介绍Springboot的事件监听机制的概念原理、其使用场景,并通过一个实践例子展示其使用过程。

概念和原理

ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现,Springboot内部的事件机制是基于观察者模式(Observer Pattern)。在这种模式下,有两个主要角色:事件发布者(Event Publisher)和事件监听者(Event Listener)。事件发布者发布事件,而事件监听者监听并处理这些事件。

在Springboot中,事件机制主要由以下几个部分组成:

  • 事件(Event):事件是继承自ApplicationEvent的类,用于封装事件相关的信息。
  • 事件发布者(Event Publisher):事件发布者通常是Spring应用上下文(ApplicationContext),它提供了发布事件的方法。
  • 事件监听者(Event Listener):事件监听者是带有@EventListener注解的方法或实现ApplicationListener接口的类,用于处理特定类型的事件。

使用场景

Spring Boot的事件机制在以下场景中非常有用:

  • 解耦模块之间的通信:不同模块之间可以通过事件进行通信,避免直接依赖,从而提高系统的灵活性和可维护性。
  • 实现异步处理:某些操作可以通过事件机制异步处理,提升应用的性能。例如,用户注册后发送欢迎邮件。
  • 状态变更通知:当系统状态发生变化时,可以通过事件机制通知相关组件。例如,订单状态变更通知。

用户注册系统实践案例

下面通过一个实践例子来介绍Springboot事件机制的使用过程。我们将创建一个简单的用户注册系统,在用户注册成功后发布一个事件,并由监听器监听该事件并发送欢迎邮件。

1. 创建事件类

首先,创建一个事件类UserRegistrationEvent,继承自ApplicationEvent

package com.example.demo.events;import org.springframework.context.ApplicationEvent;public class UserRegistrationEvent extends ApplicationEvent {private final String username;public UserRegistrationEvent(Object source, String username) {super(source);this.username = username;}public String getUsername() {return username;}
}

2. 发布事件

在用户注册成功后发布事件:

package com.example.demo.services;import com.example.demo.events.UserRegistrationEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate ApplicationEventPublisher eventPublisher;// 或者使用ApplicationContext//@AutoWired//private ApplicationContext applicationContext;public UserService(ApplicationEventPublisher eventPublisher) {this.eventPublisher = eventPublisher;}public void registerUser(String username) {// 处理用户注册逻辑System.out.println("User " + username + " registered successfully.");// 发布事件UserRegistrationEvent event = new UserRegistrationEvent(this, username);eventPublisher.publishEvent(event);// 使用applicationcontext同样// applicationContext.publishEvent(event);}
}

3. 监听事件

3.1 通过注解@EventListener实现监听

创建一个事件监听器类,监听UserRegistrationEvent事件:

package com.example.demo.listeners;import com.example.demo.events.UserRegistrationEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;@Component
public class UserRegistrationListener {@EventListenerpublic void handleUserRegistrationEvent(UserRegistrationEvent event) {System.out.println("Sending welcome email to " + event.getUsername());// 发送欢迎邮件的逻辑}
}
3.2 通过实现ApplicationListener接口实现监听

除了使用@EventListener注解来监听事件外,还可以通过实现ApplicationListener接口来监听事件。这种方式更为传统且显式,适用于更复杂的事件处理逻辑。

package com.example.demo.listeners;import com.example.demo.events.UserRegistrationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;@Component
public class UserRegistrationListenerViaInterface implements ApplicationListener<UserRegistrationEvent> {@Overridepublic void onApplicationEvent(UserRegistrationEvent event) {System.out.println("Handling user registration event via ApplicationListener: " + event.getUsername());// 发送欢迎邮件的逻辑}
}

4. 测试事件机制

最后,创建一个简单的测试类,模拟用户注册:

package com.example.demo;import com.example.demo.services.UserService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@Beanpublic CommandLineRunner demo(UserService userService) {return args -> {userService.registerUser("JohnDoe");};}
}

运行应用程序后,您将看到控制台输出:

User JohnDoe registered successfully.
Sending welcome email to JohnDoe

总结

通过本文的介绍,我们了解了Spring Boot的事件机制以及其使用场景,并通过一个实践例子展示了如何使用事件机制解耦组件之间的通信。在实际应用中,事件机制可以极大地提高系统的灵活性和可维护性,是一种值得掌握的工具。

相关文章:

【Springboot】事件机制发布与订阅的使用实践

文章目录 为什么要使用事件监听机制概念和原理使用场景用户注册系统实践案例1. 创建事件类2. 发布事件3. 监听事件3.1 通过注解EventListener实现监听3.2 通过实现ApplicationListener接口实现监听 4. 测试事件机制 总结 为什么要使用事件监听机制 在Springboot中&#xff0c;…...

新版网页无插件H.265播放器EasyPlayer.js如何测试demo视频?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff1b;支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#xff0…...

PXE、Kickstart和cobbler

一.系统装机 1.1 三种引导方式 启动操作系统 1.硬盘 2.光驱(u盘) 3.网络启动 pxe 1.2 系统安装过程 1.加载boot loader: Boot Loader 是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设 备、建立内存空间的映射图,从而将系统的软硬…...

【GameFramework扩展应用】6-3、GameFramework框架增加日志保存功能

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录: https://blog.csdn.net/q764424567/article/details/1…...

将独热码应用到神经网络中

引言 接上回&#xff0c;本文继续说如何用TensorFlow将独热编码应用到一个简单的神经网络中&#xff0c;以实现从一段随机文本到另一段随机文本的转换。 步骤一&#xff1a;导入库 import tensorflow as tf import numpy as np import random import string步骤二&#xff1…...

在CSS中,使用Flexbox布局时,可以通过几个属性来控制容器内的项目之间的间距

display弹性布局&#xff0c;flex:1是占据剩下的空间 关于displa:flex /* 水平和垂直居中&#xff0c;水平和垂直方向上的间距均匀分布 / .container { display: flex; justify-content: space-between; / 左右对齐 / align-items: center; / 上下间距 */ flex-direction: ro…...

关于HDFS 和HBase

Apache HBase 被设计为在 Hadoop 分布式文件系统 (HDFS) 上运行的一个特殊类型的数据库。大白话&#xff1a; 想象一下&#xff0c;你有一个巨大的图书馆&#xff0c;这个图书馆就像 HDFS&#xff0c;它的架子上堆满了各种各样的书籍&#xff0c;每本书都非常厚&#xff0c;而…...

【HarmonyOS】HarmonyOS NEXT学习日记:二、ArkTs语法

【HarmonyOS】HarmonyOS NEXT学习日记&#xff1a;二、ArkTs语法 众所周知TS是JS的超集,而ArkTs则可以理解为是Ts的超集。他们的基础都基于JS&#xff0c;所以学习之前最好就JS基础。我的学习重点也是放在ArkTs和JS的不同点上。 文章主要跟着官方文档学习&#xff0c;跳过了一…...

Web前端-Web开发CSS基础2-选择器

一. 基础 1. 选中所有的<p>标签&#xff1b; 2. 选中所有的<ol>标签&#xff1b; 3. 选中所有的<ul>标签&#xff1b; 4. 选中所有id为happy的标签&#xff1b; 5. 选中所有id为sad的标签&#xff1b; 6. 选中所有id为angry的标签&#xff1b; 7. 选中所有类…...

Mongodb数组字段索引之多键索引

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第92篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…...

[Spring] Spring Web MVC案例实战

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

大模型“重构”教育:解构学习奥秘,推动教育普惠

大模型“重构”千行百业系列选题 生成式人工智能的热潮&#xff0c;为AI领域的发展注入新的活力&#xff0c;而“赋能千行百业”已经成为人们普遍对于人工智能和大模型的全新理解。 人工智能和大模型技术的迅猛发展正在以前所未有的速度深刻改变着各个行业。正如专家所预测&a…...

HCNA VRP基础

交换机可以隔离冲突域&#xff0c;路由器可以隔离广播域&#xff0c;这两种设备在企业网络中应用越来越广泛。随着越来越多的终端接入到网络中&#xff0c;网络设备的负担也越来越重&#xff0c;这时网络设备可以通过专有的VRP系统来提升运行效率。通过路由平台VRP是华为公司数…...

单片机外围设备-EEPROM

eeprom用iic通信。eeprom有几个特点需要关注&#xff1a; 1、可以单字节读写 2、eeprom按页划分存储&#xff0c;不同型号的eeprom的页大小不一致&#xff0c;往eeprom写数据时&#xff0c;如果写到了该页的末尾&#xff0c;会自动从该页的开头继续写&#xff0c;把之前的数据…...

YOLO--置信度(超详细解读)

YOLO&#xff08;You Only Look Once&#xff09;算法中的置信度&#xff08;Confidence&#xff09;是一个关键概念&#xff0c;用于评估模型对预测框内存在目标对象的信心程度以及预测框对目标对象位置的准确性。 一、置信度的定义 数值范围&#xff1a;置信度是一个介于0和…...

“解锁物流新纪元:深入探索‘沂路畅通‘分布式协作平台“

"解锁物流新纪元&#xff1a;深入探索沂路畅通分布式协作平台" 在21世纪的数字浪潮中&#xff0c;物流行业作为连接生产与消费的关键纽带&#xff0c;其重要性不言而喻。然而&#xff0c;随着市场规模的持续扩大和消费者需求的日益多样化&#xff0c;传统物流模式已…...

昇思25天学习打卡营第六天|应用实践/计算机视觉/Vision Transformer图像分类

心得 运行模型似乎有点靠天意&#xff1f;每次跑模型之前先来个焚香沐浴&#xff1f;总之今天是机器视觉的最后一课了&#xff0c;尽管课程里强调模型跑得慢&#xff0c;可是我的这次运行&#xff0c;居然很快的就看到结果了。 如果一直看我这个系列文章的小伙伴&#xff0c;…...

vxe-table合并行数据

场景&#xff1a; 混批名称相同合并混批名称&#xff0c;在混批名称相同条件下合并相同的混批类型&#xff1b;在混混批类型相同条件下合并相同的混批值&#xff1b;在混批值相同条件下合并相同的单位 实现根据四个不同的key值&#xff0c;当四个key值对应相等时&#xff0c;合…...

LabVIEW异步和同步通信详细分析及比较

1. 基本原理 异步通信&#xff1a; 原理&#xff1a;异步通信&#xff08;Asynchronous Communication&#xff09;是一种数据传输方式&#xff0c;其中数据发送和接收操作在独立的时间进行&#xff0c;不需要在特定时刻对齐。发送方在任何时刻可以发送数据&#xff0c;而接收…...

【多模态学习笔记二】MINIGPT-4论文阅读

MINIGPT-4:ENHANCING VISION-LANGUAGE UNDERSTANDING WITH ADVANCED LARGE LANGUAGE MODELS 提出的MiniGPT-4使用一个投影层,将冻结的视觉编码器与冻结的先进的LLM Vicuna对齐。我们的工作首次揭示,将视觉特征与先进的大型语言模型正确对齐可以具有GPT-4所展示的许多先进的多…...

人教版高中英语选择性必修四单词音频+单词表+单词默写表(2026年最新)

2026年最新人教版高中英语选择性必修四课本单词表、单词默写表和听力音频&#xff0c;PDF高清电子版&#xff0c;可下载打印&#xff01;单词音频下载链接&#xff1a;https://pan.quark.cn/s/c757d00cb27d人教版高中英语选修四单词高频30个1、literature /ˈlɪtrətʃə(r)/ …...

免费图片去水印工具在线网站有哪些?2026年图片水印去除APP和软件推荐

在日常工作和生活中&#xff0c;我们经常会遇到需要去除图片水印的情况。无论是为了社交媒体分享、内容创作还是素材整理&#xff0c;找到一款高效的免费去水印工具都能节省不少时间。本文将为你详细介绍2026年最实用的免费图片去水印工具&#xff0c;包括在线网站、手机APP和电…...

Open MCT性能压测实战:JMeter定制化四阶测试方法论

1. 为什么Open MCT的性能不能只靠“感觉”来判断&#xff1f;Open MCT——NASA开源的航天器监控与控制平台&#xff0c;这几年在工业SCADA、能源调度、实验室数据可视化等场景里越来越常见。但凡用过它的团队&#xff0c;几乎都经历过这样一个阶段&#xff1a;开发阶段一切丝滑…...

2026网盘横评:国民级云盘领衔,这几款备选也值得一看

前言作为长期接触AI资源、代码项目、大文件存储的从业者&#xff0c;日常高频使用各类网盘。很多朋友都会纠结主流网盘该如何选择&#xff0c;不同产品的存储能力、传输表现、功能适配差距明显。本文摒弃夸张测评&#xff0c;以客观分享的视角&#xff0c;从传输、存储、功能、…...

数字图像质量提升技术【附代码】

✨ 长期致力于图像质量提升、计算机图形处理器、并行加速、非均匀校正、图像超分辨、反射光消除、深度学习、生成对抗网络研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#…...

0601光刻机 第六篇:EUV超精密光学系统(S级 长期死磕突破)第1小节:光学物镜核心原理

第六篇&#xff1a;EUV超精密光学系统&#xff08;S级 长期死磕突破&#xff09; 第1小节&#xff1a;光学物镜核心原理&#xff08;硬核无水分&#xff0c;从物理本质到工程实现&#xff09; 前置硬核声明 EUV物镜是光刻机的“原子级眼睛”&#xff0c;13.5nm波长决定透射方案…...

rebar3高级配置与性能优化:让你的构建速度提升300% [特殊字符]

rebar3高级配置与性能优化&#xff1a;让你的构建速度提升300% &#x1f680; 【免费下载链接】rebar3 Erlang build tool that makes it easy to compile and test Erlang applications and releases. 项目地址: https://gitcode.com/gh_mirrors/re/rebar3 你是否曾经因…...

百度网盘全自动化实录:Hermes Agent + bb-browser

缘起&#xff1a;今天风暴了一下&#xff0c;准备实践一下Hermes自动售卖数字产品实现自动变现的MVP&#xff0c;谁知道刚开始就卡在了操作百度网盘&#xff0c;要么被反爬&#xff0c;要么靠之前开发的computer use for win截图点坐标像瞎子摸象。最后换了条路——用 bb-brows…...

Cadence 17.4 CIS配置踩坑实录:MySQL元件数据库连接失败与中文乱码全解决

Cadence 17.4 CIS配置实战&#xff1a;MySQL元件数据库连接与中文乱码终极解决方案 当工程师尝试将Cadence CIS与MySQL数据库集成时&#xff0c;往往会遇到两个令人头疼的问题&#xff1a;连接失败和中文乱码。这两个问题看似简单&#xff0c;却可能耗费大量调试时间。本文将深…...

反向传播:从轮廓到精雕细琢

反向传播&#xff1a;从轮廓到精雕细琢模型知道损失值之后&#xff0c;怎么调整自己的参数&#xff1f;上一篇文章我们讲了损失函数——它像一个指南针&#xff0c;告诉模型"你离正确答案还有多远"。 那知道偏了之后&#xff0c;模型该怎么调整自己的参数&#xff1f…...