解讀@EventListener工作原理
@EventListener 是 Spring Framework 提供的用于處理事件監(jiān)聽的注解。
它的工作原理基于觀察者設計模式,其中有一個事件發(fā)布者(publisher)和一個或多個事件監(jiān)聽者(listener)。
事件發(fā)布者(Event Publisher)
當某個事件發(fā)生時,Spring 應用內(nèi)的某個組件(通常是服務、控制器、或其他組件)會觸發(fā)一個事件。
事件發(fā)布者并不直接調(diào)用事件監(jiān)聽者的方法,而是將事件封裝成一個事件對象,并將該事件對象發(fā)布到 Spring 應用上下文。
事件發(fā)布者通常不關心哪些監(jiān)聽者在監(jiān)聽事件,只需將事件發(fā)布出去即可。
事件監(jiān)聽者(Event Listener)
通過 @EventListener 注解,開發(fā)者可以在任何 Spring 管理的 Bean 方法上標注監(jiān)聽事件的方法。
當一個帶有 @EventListener 注解的方法的參數(shù)類型與發(fā)布的事件類型匹配時,Spring 將自動調(diào)用該方法,將事件傳遞給它。
方法可以定義多個參數(shù),每個參數(shù)表示一個事件類型,如果發(fā)布的事件類型匹配任一參數(shù)類型,方法就會被調(diào)用。
事件處理順序:
- 默認情況下,Spring 會按照監(jiān)聽方法的注冊順序調(diào)用它們。
- 如果需要更加精細的控制,可以使用 @Order 注解來指定監(jiān)聽方法的執(zhí)行順序。
異步處理
@EventListener 方法可以使用 @Async 注解,實現(xiàn)異步處理。這樣,當事件觸發(fā)時,監(jiān)聽方法將在獨立的線程中執(zhí)行,不會阻塞主線程。
需要在主程序類上添加 @EnableAsync 注解啟用 Spring 的異步處理。
Demo
import org.springframework.context.ApplicationEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @Component public class MyEventListener { @EventListener public void handleEvent(MyEvent event) { // 處理 MyEvent 事件 System.out.println("Event handled: " + event.getMessage()); } } public class MyEvent extends ApplicationEvent { private String message; public MyEvent(Object source, String message) { super(source); this.message = message; } public String getMessage() { return message; } }
MyEvent 是自定義的事件對象,MyEventListener 中的 handleEvent 方法使用 @EventListener 注解監(jiān)聽 MyEvent 事件。
當 MyEvent 事件被發(fā)布時,handleEvent 方法將會被自動調(diào)用,執(zhí)行事件處理邏輯。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot+WebSocket搭建簡單的多人聊天系統(tǒng)
WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議。這是一種比較官方的說法,簡單點來說就是,在一次TCP連接中,通信的雙方可以相互通信。這篇文章主要介紹了SpringBoot+WebSocket搭建簡單的多人聊天系統(tǒng),需要的朋友可以參考下2019-10-10Java初級必看的數(shù)據(jù)類型與常量變量知識點
這篇文章主要給大家介紹了關于Java初級必看的數(shù)據(jù)類型與常量變量知識點的相關資料,需要的朋友可以參考下2023-11-11Spring Boot2.0整合ES5實現(xiàn)文章內(nèi)容搜索實戰(zhàn)
這篇文章主要介紹了Spring Boot2.0整合ES5實現(xiàn)文章內(nèi)容搜索實戰(zhàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01Java?中很好用的數(shù)據(jù)結(jié)構(gòu)(你絕對沒用過)
今天跟大家介紹的就是?java.util.EnumMap,也是?java.util?包下面的一個集合類,同樣的也有對應的的?java.util.EnumSet,對java數(shù)據(jù)結(jié)構(gòu)相關知識感興趣的朋友一起看看吧2022-05-05SpringBoot+Hutool實現(xiàn)圖片驗證碼的示例代碼
圖片驗證碼在注冊、登錄、交易、交互等各類場景中都發(fā)揮著巨大作用,本文主要介紹了SpringBoot+Hutool實現(xiàn)圖片驗證碼的示例代碼,具有一定的參考價值,感興趣的可以了解一下2024-01-01SpringBoot+ruoyi框架文件上傳和下載的實現(xiàn)
文件的上傳和下載功能,是項目開發(fā)過程中比較常見的業(yè)務需求,本文主要介紹了SpringBoot+ruoyi框架文件上傳和文件下載的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-09-09