解讀@EventListener工作原理
@EventListener 是 Spring Framework 提供的用于處理事件監(jiān)聽的注解。
它的工作原理基于觀察者設(shè)計(jì)模式,其中有一個(gè)事件發(fā)布者(publisher)和一個(gè)或多個(gè)事件監(jiān)聽者(listener)。
事件發(fā)布者(Event Publisher)
當(dāng)某個(gè)事件發(fā)生時(shí),Spring 應(yīng)用內(nèi)的某個(gè)組件(通常是服務(wù)、控制器、或其他組件)會(huì)觸發(fā)一個(gè)事件。
事件發(fā)布者并不直接調(diào)用事件監(jiān)聽者的方法,而是將事件封裝成一個(gè)事件對(duì)象,并將該事件對(duì)象發(fā)布到 Spring 應(yīng)用上下文。
事件發(fā)布者通常不關(guān)心哪些監(jiān)聽者在監(jiān)聽事件,只需將事件發(fā)布出去即可。
事件監(jiān)聽者(Event Listener)
通過(guò) @EventListener 注解,開發(fā)者可以在任何 Spring 管理的 Bean 方法上標(biāo)注監(jiān)聽事件的方法。
當(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)聽方法的注冊(cè)順序調(diào)用它們。
- 如果需要更加精細(xì)的控制,可以使用 @Order 注解來(lái)指定監(jiān)聽方法的執(zhí)行順序。
異步處理
@EventListener 方法可以使用 @Async 注解,實(shí)現(xiàn)異步處理。這樣,當(dāng)事件觸發(fā)時(shí),監(jiān)聽方法將在獨(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)聽 MyEvent 事件。
當(dāng) MyEvent 事件被發(fā)布時(shí),handleEvent 方法將會(huì)被自動(dòng)調(diào)用,執(zhí)行事件處理邏輯。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot啟動(dòng)之SpringApplication初始化詳解
這篇文章主要介紹了SpringBoot啟動(dòng)之SpringApplication初始化詳解,首先初始化資源加載器,默認(rèn)為null;斷言判斷主要資源類不能為null,否則報(bào)錯(cuò),需要的朋友可以參考下2024-01-01
SpringBootTest報(bào)錯(cuò)的問(wèn)題解決
本文主要介紹了SpringBootTest報(bào)錯(cuò)的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-09-09
java簡(jiǎn)單網(wǎng)頁(yè)抓取的實(shí)現(xiàn)方法
這篇文章主要介紹了java簡(jiǎn)單網(wǎng)頁(yè)抓取的實(shí)現(xiàn)方法,詳細(xì)分析了與Java網(wǎng)頁(yè)抓取相關(guān)的tcp及URL相關(guān)概念,以及對(duì)應(yīng)的類文件原理,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12
Spring boot + mybatis + orcale實(shí)現(xiàn)步驟實(shí)例代碼講解
這篇文章主要介紹了Spring boot + mybatis + orcale的實(shí)現(xiàn)步驟實(shí)例代碼講解,需要的朋友可以參考下2017-12-12
SpringBoot登錄攔截配置詳解(實(shí)測(cè)可用)
這篇文章主要介紹了SpringBoot登錄攔截配置詳解(實(shí)測(cè)可用),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Java函數(shù)式編程(十二):監(jiān)控文件修改
這篇文章主要介紹了Java函數(shù)式編程(十二):監(jiān)控文件修改,本文是系列文章的第12篇,其它文章請(qǐng)參閱本文底部的相關(guān)文章,需要的朋友可以參考下2014-09-09
Java httpcomponents發(fā)送get post請(qǐng)求代碼實(shí)例
這篇文章主要介紹了Java httpcomponents發(fā)送get post請(qǐng)求代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09

