解讀@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ù)類(lèi)型與發(fā)布的事件類(lèi)型匹配時(shí),Spring 將自動(dòng)調(diào)用該方法,將事件傳遞給它。
方法可以定義多個(gè)參數(shù),每個(gè)參數(shù)表示一個(gè)事件類(lèi)型,如果發(fā)布的事件類(lèi)型匹配任一參數(shù)類(lèi)型,方法就會(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ì)阻塞主線程。
需要在主程序類(lèi)上添加 @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-10
Java初級(jí)必看的數(shù)據(jù)類(lèi)型與常量變量知識(shí)點(diǎn)
這篇文章主要給大家介紹了關(guān)于Java初級(jí)必看的數(shù)據(jù)類(lèi)型與常量變量知識(shí)點(diǎn)的相關(guān)資料,需要的朋友可以參考下2023-11-11
Spring 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-01
Java?中很好用的數(shù)據(jù)結(jié)構(gòu)(你絕對(duì)沒(méi)用過(guò))
今天跟大家介紹的就是?java.util.EnumMap,也是?java.util?包下面的一個(gè)集合類(lèi),同樣的也有對(duì)應(yīng)的的?java.util.EnumSet,對(duì)java數(shù)據(jù)結(jié)構(gòu)相關(guān)知識(shí)感興趣的朋友一起看看吧2022-05-05
SpringBoot+Hutool實(shí)現(xiàn)圖片驗(yàn)證碼的示例代碼
圖片驗(yàn)證碼在注冊(cè)、登錄、交易、交互等各類(lèi)場(chǎng)景中都發(fā)揮著巨大作用,本文主要介紹了SpringBoot+Hutool實(shí)現(xiàn)圖片驗(yàn)證碼的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
SpringBoot+ruoyi框架文件上傳和下載的實(shí)現(xiàn)
文件的上傳和下載功能,是項(xiàng)目開(kāi)發(fā)過(guò)程中比較常見(jiàn)的業(yè)務(wù)需求,本文主要介紹了SpringBoot+ruoyi框架文件上傳和文件下載的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09

