解讀@EventListener工作原理
@EventListener 是 Spring Framework 提供的用于處理事件監(jiān)聽的注解。
它的工作原理基于觀察者設(shè)計模式,其中有一個事件發(fā)布者(publisher)和一個或多個事件監(jiān)聽者(listener)。
事件發(fā)布者(Event Publisher)
當(dāng)某個事件發(fā)生時,Spring 應(yīng)用內(nèi)的某個組件(通常是服務(wù)、控制器、或其他組件)會觸發(fā)一個事件。
事件發(fā)布者并不直接調(diào)用事件監(jiān)聽者的方法,而是將事件封裝成一個事件對象,并將該事件對象發(fā)布到 Spring 應(yīng)用上下文。
事件發(fā)布者通常不關(guān)心哪些監(jiān)聽者在監(jiān)聽事件,只需將事件發(fā)布出去即可。
事件監(jiān)聽者(Event Listener)
通過 @EventListener 注解,開發(fā)者可以在任何 Spring 管理的 Bean 方法上標注監(jiān)聽事件的方法。
當(dāng)一個帶有 @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)異步處理。這樣,當(dāng)事件觸發(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 事件。
當(dāng) MyEvent 事件被發(fā)布時,handleEvent 方法將會被自動調(diào)用,執(zhí)行事件處理邏輯。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot啟動之SpringApplication初始化詳解
這篇文章主要介紹了SpringBoot啟動之SpringApplication初始化詳解,首先初始化資源加載器,默認為null;斷言判斷主要資源類不能為null,否則報錯,需要的朋友可以參考下2024-01-01
Spring boot + mybatis + orcale實現(xiàn)步驟實例代碼講解
這篇文章主要介紹了Spring boot + mybatis + orcale的實現(xiàn)步驟實例代碼講解,需要的朋友可以參考下2017-12-12
Java函數(shù)式編程(十二):監(jiān)控文件修改
這篇文章主要介紹了Java函數(shù)式編程(十二):監(jiān)控文件修改,本文是系列文章的第12篇,其它文章請參閱本文底部的相關(guān)文章,需要的朋友可以參考下2014-09-09
Java httpcomponents發(fā)送get post請求代碼實例
這篇文章主要介紹了Java httpcomponents發(fā)送get post請求代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09

