Spring中的事件監聽器使用學習

一、什么是Spring中的事件監聽機制?

? ? ? ? Spring框架中的事件監聽機制是一種設計模式,它允許你定義和觸發事件,同時允許其他組件監聽這些事件并在事件發生時作出響應。這種機制基于觀察者模式,提供了一種松耦合的方式來實現組件間的通信。

二、Spring事件監聽機制的關鍵概念

? ? ? ? 1. 事件(Event)

????????事件是應用程序中的一個信號,表明某個動作已經發生或某個條件已經滿足。在Spring中,事件通常是實現ApplicationEvent接口的類來表示的。Spring為我們提供了多種內置的事件類型,如ContextStartedEvent、ContextRefreshedEvent,ContextCloseEvent、ContextStoppedEvent等事件,分別對應于應用程序上下文的不同生命周期階段。當然我們也可以自定義自己的事件類型,即:通過實現ApplicationEvent接口或擴展ApplicationEvent類。

? ? ? ? 2. 事件發布者(Event Publisher)

????????事件發布者負責將事件發布出去,然后通過Spring的智能事件派發,把發布的事件派發給對應該事件類型的所有監聽器。在Spring中,ApplicationContext自身就是一個事件發布者(因為ApplicationContext接口繼承了ApplicationEventPublisher接口),它可以發布應用程序事件(比如ContextRefreshedEvent ,ContextCloseEvent等事件)。【通常我們會讓自定義組件實現 ApplicationEventPublisherAware接口,然后實現接口中的如下方法把事件發布者對象注入到組件中】

    @Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.applicationEventPublisher = applicationEventPublisher;}

? ? ? ? 3. 事件監聽器(Event Listener)

????????事件監聽器是實現ApplicationListener接口的組件,它們可以監聽和響應事件。監聽器需要實現onApplicationEvent方法,以便在接收到事件時進行處理。此外,Spring給我們提供了一個 @EventListener注解,允許你直接在方法上標注以監聽特定類型的事件。當事件發生時,Spring會自動調用這些方法。(注意:事件監聽器一定要放入IOC容器中才會生效。)

? ? ? ? 4. 事件傳播

????????事件可以在不同的Spring容器之間傳播,例如從子容器傳播到父容器。

? ? ? ? 5. 同步與異步事件

????????Spring支持同步和異步事件處理。

三、實現一個簡單的事件監聽功能

? ? ? ? 需求描述:?程序中有一個添加用戶的業務組件,要求當用戶添加成功時,發布一個添加用戶成功事件,然后通過添加用戶成功事件的監聽器給管理員發送一封郵件。

1. 業務組件

????????

package com.shg.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.shg.beans.User;public interface UserService extends IService<User> {User addUser(User user);
}
package com.shg.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.shg.beans.User;
import com.shg.listener.event.UserAddSuccessEvent;
import com.shg.mapper.UserMapper;
import com.shg.service.UserService;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Service;@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService, ApplicationEventPublisherAware {private ApplicationEventPublisher applicationEventPublisher;private final UserMapper userMapper;public UserServiceImpl(UserMapper userMapper) {this.userMapper = userMapper;}@Overridepublic User addUser(User user) {userMapper.insert(user);applicationEventPublisher.publishEvent(new UserAddSuccessEvent(this, user));return user;}@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.applicationEventPublisher = applicationEventPublisher;}
}

2. 添加用戶成功事件

package com.shg.listener.event;import com.shg.beans.User;
import org.springframework.context.ApplicationEvent;public class UserAddSuccessEvent extends ApplicationEvent {private final User user;public UserAddSuccessEvent(Object source, User user) {super(source);this.user = user;}public User getUser() {return user;}
}

3. 添加用戶成功事件監聽器

package com.shg.listener;import com.shg.listener.event.UserAddFailEvent;
import com.shg.listener.event.UserAddSuccessEvent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;// 實現ApplicationListener接口的方式
// @Slf4j
// @Component
// public class UserAddListener implements ApplicationListener<UserAddSuccessEvent> {
//     @Override
//     public void onApplicationEvent(UserAddSuccessEvent event) {
//         log.info("創建用戶:{}, 成功,已發送短信給管理員...", event.getUser());
//     }
// }// 使用@EventListener的方式
@Slf4j
@Component
public class UserAddListener {@EventListener(value = {UserAddSuccessEvent.class})public void listenerUserAddSuccessEvent(UserAddSuccessEvent event) {log.info("創建用戶:{}, 成功,已發送短信給管理員...", event.getUser());}
}

4. 運行結果

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

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

相關文章

Linux 系統性能分析與故障排查:從入門到進階

Linux 系統性能分析與故障排查&#xff1a;從入門到進階 作為系統管理員或 IT 專業人員&#xff0c;掌握系統性能分析和故障排查技能至關重要。這些技能可以幫助你識別和解決系統性能問題&#xff0c;確保系統穩定運行。本文將介紹系統性能分析和故障排查的基本方法&#xff0…

CTF實戰:從入門到提升

CTF實戰&#xff1a;從入門到提升 &#x1f680;前言 沒有網絡安全就沒有國家安全&#xff0c;網絡安全不僅關系到國家整體信息安全&#xff0c;也關系到民生安全。近年來&#xff0c;隨著全國各行各業信息化的發展&#xff0c;網絡與信息安全得到了進一步重視&#xff0c;越…

XAML 框架橫向對比

多年來&#xff0c;基于 XAML 的 UI 框架有了很大的發展。下面的圖表很好地證明了這個觀點。XAML UI 框架的三大巨頭&#xff1a;Avalonia UI、Uno Platform 和 .NET MAUI 都支持跨平臺的應用。事實上&#xff0c;除了 Avalonia UI&#xff0c;對跨平臺 XAML 的需求是它們發展的…

【深度學習】圖形模型基礎(5):線性回歸模型第四部分:預測與貝葉斯推斷

1.引言 貝葉斯推斷超越了傳統估計方法&#xff0c;它包含三個關鍵步驟&#xff1a;結合數據和模型形成后驗分布&#xff0c;通過模擬傳播不確定性&#xff0c;以及利用先驗分布整合額外信息。本文將通過實際案例闡釋這些步驟&#xff0c;展示它們在預測和推斷中的挑戰和應用。…

Unity 使用AVProMovieCapture實現Game視圖屏幕錄制

內容將會持續更新&#xff0c;有錯誤的地方歡迎指正&#xff0c;謝謝! Unity 使用AVProMovieCapture實現Game視圖屏幕錄制 TechX 堅持將創新的科技帶給世界&#xff01; 擁有更好的學習體驗 —— 不斷努力&#xff0c;不斷進步&#xff0c;不斷探索 TechX —— 心探索、心…

【云計算】公有云、私有云、混合云、社區云、多云

公有云、私有云、混合云、社區云、多云 1.云計算的形態1.1 公有云1.2 私有云1.3 混合云1.4 社區云1.5 多云1.5.1 多云和混合云之間的關系1.5.2 多云的用途1.5.3 影子 IT 和多云1.5.4 優缺點 2.不同云形態的對比 1.云計算的形態 張三??在家做飯吃&#xff0c;這是 私有云&…

liunx上修改Firefox版本號

在Linux上修改Firefox的版本號并不直接推薦也不鼓勵&#xff0c;因為這可能會影響到瀏覽器的安全性、兼容性和自動更新功能。但如果你因為某些特殊測試場景確實需要修改其顯示的版本號&#xff08;請注意&#xff0c;這樣做可能會引發不可預料的問題&#xff09;&#xff0c;可…

【擴散模型】LCM LoRA:一個通用的Stable Diffusion加速模塊

潛在一致性模型&#xff1a;[2310.04378] Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference (arxiv.org) 原文&#xff1a;Paper page - Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference (…

ELK優化之Filebeat部署

目錄 1.安裝配置Nginx 2.安裝 Filebeat 3.設置 filebeat 的主配置文件 4.修改Logstash配置 5.啟動配置 6.kibana驗證 主機名ip地址主要軟件es01192.168.9.114ElasticSearches02192.168.9.115ElasticSearches03192.168.9.116ElasticSearch、Kibananginx01192.168.9.113ng…

【鎖】各種鎖的概念

解釋一下什么是樂觀鎖、悲觀鎖、自旋鎖、互斥鎖、讀寫鎖、排他鎖、共享鎖、統一鎖、分段鎖&#xff1f; 定義角度不同&#xff0c;通常把&#xff08;樂觀鎖、悲觀鎖&#xff09;、&#xff08;自旋鎖、互斥鎖&#xff09;、&#xff08;讀寫鎖、排他鎖、共享鎖&#xff09;、…

Redis---9---集群(cluster)

將新增的6387節點&#xff08;空槽號&#xff09;作為master節點加入原集群 Redis—9—集群&#xff08;cluster&#xff09; 是什么 定義 ? 由于數據量過大&#xff0c;單個Master復制集難以承擔&#xff0c;因此需要對多個復制集進行集群&#xff0c;形成水平擴展每個復…

Selenium 切換窗口

環境&#xff1a; Python 3.8 selenium3.141.0 urllib31.26.19說明&#xff1a; driver.current_window_handle # 返回當前窗口的句柄 driver.window_handles # 返回當前由driver啟動所有窗口句柄&#xff0c;是個列表 driver.switch_to.window(handle) # 根據 handle 切換窗口…

5個實用的文章生成器,高效輸出優質文章

在自媒體時代&#xff0c;優質內容的持續輸出是吸引讀者、提升影響力的關鍵。然而&#xff0c;對于許多自媒體創作者來說&#xff0c;頻繁的創作難免會遭遇靈感枯竭、創作不出文章的困擾。此時&#xff0c;文章生成器便成為了得力的助手。文章生成器的優勢能夠快速自動生成高質…

代碼隨想錄算法訓練營第13天|二叉樹的遞歸遍歷、二叉樹的迭代遍歷、二叉樹的統一迭代法、102.二叉樹的層序遍歷

打卡Day13 1.理論基礎2.二叉樹的遞歸遍歷3.二叉樹的迭代遍歷3.二叉樹的統一迭代法4.102.二叉樹的層序遍歷擴展107. 二叉樹的層序遍歷 II199.二叉樹的右視圖637.二叉樹的層平均值429.N叉樹的層序遍歷515.在每個樹行中找最大值116.填充每個節點的下一個右側節點指針117. 填充每個…

如何保證接口冪等性

如何保證接口冪等性 1、冪等性是什么&#xff1f; 接口冪等性是指用戶對于同一操作發起的一次請求或者多次請求的結果是一致的&#xff0c;不會因為多次點擊而產生了不同的結果。 2、使用冪等性的場景有哪些&#xff1f; 頁面點擊保存按鈕時&#xff0c;不小心快速點了兩次…

Python面試題-6

1. 請解釋Python中的動態類型。 Python中的動態類型 Python是一種動態類型語言&#xff0c;這意味著你不需要在編程時聲明變量的類型&#xff0c;而是在運行時自動推斷類型。在Python中&#xff0c;變量的類型是在程序運行時決定的&#xff0c;這意味著同一個變量可以在不改變…

上萬組風電,光伏,用戶負荷數據分享

上萬組風電&#xff0c;光伏&#xff0c;用戶負荷數據分享 可用于風光負荷預測等研究 獲取鏈接&#x1f517; https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取碼&#xff1a;381i 獲取鏈接&#x1f517; https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取…

一行代碼用git新建分支

1.在本地創建分支 dev git branch dev2.切換分支 git checkout devwebstorm操作如下&#xff1a; 3.推送新分支到遠程 git push --set-upstream origin 分支名webstorm操作如下&#xff1a;提交代碼的時候會自動推送到遠程 4.到git上面可以看看剛剛推送的內容 dev多推送…

Proxmox VE 8虛擬機直通USB磁盤

作者&#xff1a;田逸&#xff08;fromyz&#xff09; 今天有個兄弟發消息&#xff0c;咨詢怎么讓插在服務器上的U盾被Proxmox VE上的虛擬機識別。在很久很久以前&#xff0c;我嘗試過在Proxmox VE 5以前的版本創建windows虛擬機&#xff0c;并把插在Proxmox VE宿主機上的銀行U…

基于STM32設計的智能喂養系統(ESP8266+微信小程序)175

基于STM32設計的牛羊喂養系統(微信小程序)(175) 文章目錄 一、前言1.1 項目介紹【1】項目功能介紹【2】項目硬件模塊組成【3】ESP8266工作模式配置【4】上位機開發【5】項目模塊劃分1.2 項目功能需求1.3 項目開發背景1.4 開發工具的選擇1.5 系統框架圖1.6 系統原理圖1.7 硬件實…