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