springboot中的事件發布和監聽

事件定義

創建一個自定義事件類 UserLoginEvent,繼承 ApplicationEvent,用于攜帶用戶登錄信息:

import org.springframework.context.ApplicationEvent;public class UserLoginEvent extends ApplicationEvent {  //關鍵點1:extends ApplicationEventprivate String username;public UserLoginEvent(Object source, String username) {super(source);this.username = username;}public String getUsername() {return username;}
}
事件發布

在用戶登錄邏輯中發布事件,例如在 LoginService 中:

import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;@Service
public class LoginService {private final ApplicationEventPublisher eventPublisher;public LoginService(ApplicationEventPublisher eventPublisher) {this.eventPublisher = eventPublisher;}public void login(String username) {// 模擬登錄邏輯System.out.println("用戶登錄成功: " + username);// 關鍵點2:事件的發布,就一行代碼eventPublisher.publishEvent(new UserLoginEvent(this, username));}
}
事件監聽

通過 @EventListener 注解實現監聽,記錄日志:

import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;@Component
public class UserLoginEventListener {@EventListenerpublic void handleUserLoginEvent(UserLoginEvent event) {//關鍵點3:這里意味著監聽某個類型的事件System.out.println("[日志] 用戶登錄事件觸發: " + event.getUsername());}
}
測試驗證

編寫測試類或控制器調用登錄方法:

@RestController
public class LoginController {private final LoginService loginService;public LoginController(LoginService loginService) {this.loginService = loginService;}@GetMapping("/login")public String login(@RequestParam String username) {loginService.login(username);return "Login triggered for: " + username;}
}

訪問 http://localhost:8080/login?username=testUser,控制臺將輸出:

用戶登錄成功: testUser
[日志] 用戶登錄事件觸發: testUser
關鍵說明
  • 默認同步執行,若需異步處理可在監聽方法上添加 @Async 注解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87351.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87351.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87351.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

“開源雙軌架構+40億參數擴散Transformer——ComfyUI-OmniGen2本地部署教程:重塑多模態生成的效率邊界!

一、簡介 OmniGen2 是由北京智源研究院最新推出的一個強大、高效的開源多模態生成模型。與 OmniGen v1 不同,OmniGen2 具有兩種不同的文本和圖像模態解碼路徑,利用非共享參數和解耦的圖像分詞器。OmniGen2 在四個主要功能方面具有競爭力的性能&#xff…

Java的SpringAI+Deepseek大模型實戰之會話記憶

文章目錄 背景項目環境實現步驟第一步、定義會話存儲方式方式一、定義記憶存儲ChatMemory方式二、注入記憶存儲ChatMemory 第二步、配置會話記憶方式一、老版本實現方式二、新版本實現 第三步、存儲會話信息 異常處理1、InMemoryChatMemory 無法解析 背景 前兩期【環境搭建】和…

RDS MySQL vs. Aurora MySQL:高需求工作負載的終極遷移指南

在 AWS 上,開發團隊最常見且關鍵的決策之一就是選擇合適的關系型數據庫。通常,討論會從 RDS for MySQL 這個可靠且熟悉的“老黃牛”開始。但很快,就會有人提到一個更強大、更云原生的選項:Aurora MySQL。 也許,就像最…

使用倉頡編程語言是一種怎樣的體驗?

2024年6月21日下午,華為終端BG軟件部總裁龔體先生在華為開發者大會主題演講《鴻蒙原生應用,全新出發!》中向全球開發者介紹了華為自研倉頡編程語言,并發布了HarmonyOS NEXT倉頡語言開發者預覽版。這是華為首次公開倉頡編程語言。 …

Qt Creator自定義控件開發流程

Qt Creator自定義控件開發流程 在 Qt 5.9 Creator 中開發自定義控件的完整流程如下,分為設計、實現、集成和測試四個階段: 1. 創建自定義控件類 (1) 新建類文件 右鍵項目 → 添加新文件 → C Class基類選擇 QWidget 或現有控件(如 QPushBu…

翻譯《The Old New Thing》- 如何創建一個與屏幕大小相同的窗口,而不會被當作全屏窗口處理?

How can I create a window the size of the screen without it being treated as a fullscreen window? - The Old New Thinghttps://devblogs.microsoft.com/oldnewthing/20250522-00/?p111211 問題描述 任務欄允許全屏窗口覆蓋它。這樣,當你在放映幻燈片或進行…

深分頁末日救星:MySQL延遲關聯原理與實戰手冊

MySQL 深分頁(如 LIMIT 100000, 10)本質是 高代價的偏移量掃描,可通過以下方案優化,附核心原理和實操示例: 一、深分頁為什么慢? SELECT * FROM orders ORDER BY id DESC LIMIT 100000, 10; 執行過程&…

前端技術棧 —— HTML、CSS和JavaScirpt執行環境

以下內容由GLM回答生成,不保證正確性。 前端技術棧 —— HTML、CSS和JavaScirpt執行環境 JavaScript 的執行環境HTML 和 CSS 的執行環境HTML 和 CSS 是否可以在其他環境中執行?總結 JavaScript 是一種 解釋型語言,但它也可以被編譯。JavaScr…

多項式帶余除法——線性代數題目為例

一、多項式帶余除法的定義 二、例題 使用方法將在例題中展示:

學習日記-spring-day40-7.3

知識點: 1.自動裝配Resource(3) 知識點 核心內容 重點 Autowired與Resource注入規則 默認注入邏輯:未指定參數時,Resource優先按屬性名匹配(by name),失敗后按類型匹配&#xf…

重新認識JNIEnv

引言 拋開一堆概念,我們從本質出發。 java 調用c 我們開發移動端或者后端服務 ,都是用的java 或者kotlin 語言。有時候我們需要用c的一些庫(ocr識別/導航的算法/ 等) 因為一些跟硬件相關的接口或者系統的api 都是c寫的。 C調用J…

人工智能訓練師——智能語音識別ASR

人機對話——ASR 概念 ASR(Automatic Speech Recognition,自動語音識別)是一種將人類語音轉換為文本的技術。它使得計算機能夠“聽”懂人類的語音指令或對話,并將其轉換成可讀、可編輯的文本形式。ASR技術是人機交互領域中的一個…

Compose 常用命令詳解——AI教你學Docker

3.3 Compose 常用命令詳解 Docker Compose 通過一系列命令高效管理多容器應用。理解這些命令,可以讓你靈活地啟動、停止、查看、調試、擴縮容和配置 Compose 項目。 一、核心命令詳解 1. docker compose up 功能:啟動并構建所有服務,生成網…

Mausezahn - 網絡流量生成與測試工具(支持從鏈路層到應用層的協議模擬)

Mausezahn 是一個 網絡流量生成與測試工具,主要用于模擬各種網絡協議行為、測試網絡設備性能、驗證安全策略或進行故障排查。它支持從底層鏈路層(如 Ethernet、VLAN)到高層應用層(如 HTTP、DNS)的協議模擬,…

08-three.js Textures

Three.js Journey — Learn WebGL with Three.jsThe ultimate Three.js course whether you are a beginner or a more advanced developerhttps://threejs-journey.com/?c=p3 使用原生 JavaScript 首先是靜態頁面的放置位置,如果使用Vite模版配置,可以直接放在 /static/ …

git 倉庫取消合并的分支

要取消 Git 倉庫中某次特定的分支合并(例如第一次合并),同時保留其他分支的合并,需要通過 Git 的版本控制功能來操作。以下是具體的步驟和方法,假設你想撤銷某次合并(例如某個提交),并確保其他合并不受影響: 背景假設 你有一個 Git 倉庫,主分支(例如 main)上已經合…

【從歷史數據分析英特爾該如何擺脫困境】

與大多數其他分析師不同,自2013年以來,筆者就一直在積極強調英特爾未來將遭遇冰山,最終我們預測英特爾將在試圖執行其之前的戰略時破產。盡管我們更愿意采用與英特爾不同的代工廠方法(即與臺積電成立合資企業)&#xf…

【PyTorch】PyTorch中張量(Tensor)微分操作

PyTorch深度學習總結 第六章 PyTorch中張量(Tensor)微分操作 文章目錄 PyTorch深度學習總結前言一、torch.autograd模塊二、主要功能和使用方法1. 張量的 requires_grad 屬性2. backward() 方法3. torch.no_grad() 上下文管理器三、函數總結前言 上文介紹了PyTorch中張量(Ten…

Rust 項目實戰:Flappy Bird 游戲

Rust 項目實戰:Flappy Bird 游戲 Rust 項目實戰:Flappy Bird 游戲理解 Game loop開發庫:bracket-libbracket-terminalCodepage 437導入 bracket-lib 創建游戲游戲的模式添加玩家添加障礙最終效果項目源碼 Rust 項目實戰:Flappy Bi…

Gin 中間件詳解與實踐

一、中間件的核心概念 定義 中間件是Web開發中非常重要的概念,它可以在請求到達最終處理函數之前或響應返回客戶端之前執行一系列操作。Gin 框架支持自定義和使用內置的中間件,讓你在請求到達路由處理函數前進行一系列預處理操作。 它是介于請求與響應處…