SpringBoot事件監(jiān)聽器@EventListener的實(shí)現(xiàn)
1.概述
- 在 Spring 框架中,@EventListener是一個(gè)用于處理應(yīng)用程序事件的注解。它提供了一種方便的方式來(lái)監(jiān)聽和響應(yīng)各種事件,使得代碼可以基于事件驅(qū)動(dòng)的方式進(jìn)行架構(gòu)。通過(guò)@EventListener注解,可以將一個(gè)方法標(biāo)記為事件監(jiān)聽器,當(dāng)對(duì)應(yīng)的事件被發(fā)布時(shí),該方法就會(huì)被自動(dòng)調(diào)用。
2.事件驅(qū)動(dòng)架構(gòu)基礎(chǔ)
- 事件(Event):事件是對(duì)應(yīng)用程序中某個(gè)動(dòng)作或者狀態(tài)變化的抽象表示。例如,用戶注冊(cè)成功、訂單已支付、文件上傳完成等都可以看作是事件。在Spring 中,事件通常是一個(gè)繼承自ApplicationEvent的類。
- 事件發(fā)布者(Publisher):負(fù)責(zé)發(fā)布事件的組件。它會(huì)在特定的業(yè)務(wù)邏輯執(zhí)行過(guò)程中,創(chuàng)建并發(fā)布事件。例如,在用戶注冊(cè)服務(wù)類中,當(dāng)用戶注冊(cè)成功后,會(huì)發(fā)布一個(gè)UserRegisteredEvent。
- 事件監(jiān)聽器(Listener):通過(guò)@EventListener注解標(biāo)記的方法所在的類就是事件監(jiān)聽器。它會(huì)訂閱感興趣的事件,當(dāng)事件發(fā)布時(shí),監(jiān)聽器中的相應(yīng)方法就會(huì)被觸發(fā),執(zhí)行自定義的邏輯,如發(fā)送歡迎郵件、更新用戶積分等。
3.使用示例
- 定義事件類:首先需要定義一個(gè)事件類,繼承自ApplicationEvent。例如,定義一個(gè)用戶注冊(cè)成功的事件類:
- 這里UserRegisteredEvent類繼承自ApplicationEvent,并且包含了一個(gè)User對(duì)象,用于傳遞用戶相關(guān)的信息。
- 發(fā)布事件:在業(yè)務(wù)邏輯中,當(dāng)用戶注冊(cè)成功后,發(fā)布事件。假設(shè)在一個(gè)UserService類中有一個(gè)用戶注冊(cè)方法:
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final ApplicationEventPublisher eventPublisher;
public UserService(ApplicationEventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}
public void registerUser(User user) {
// 實(shí)際的用戶注冊(cè)邏輯,如保存用戶信息到數(shù)據(jù)庫(kù)等
//...
// 注冊(cè)成功后發(fā)布事件
UserRegisteredEvent event = new UserRegisteredEvent(this, user);
eventPublisher.publishEvent(event);
}
}
- 這里UserService類通過(guò)構(gòu)造函數(shù)注入了ApplicationEventPublisher,在用戶注冊(cè)成功后,創(chuàng)建UserRegisteredEvent并發(fā)布。
- 監(jiān)聽事件:使用@EventListener注解來(lái)監(jiān)聽事件。例如,創(chuàng)建一個(gè)監(jiān)聽器類來(lái)發(fā)送歡迎郵件給新注冊(cè)用戶:
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class WelcomeEmailListener {
@EventListener
public void sendWelcomeEmail(UserRegisteredEvent event) {
User user = event.getUser();
// 發(fā)送歡迎郵件的邏輯,如調(diào)用郵件發(fā)送服務(wù)
System.out.println("發(fā)送歡迎郵件給用戶: " + user.getEmail());
}
}
- 在這個(gè)WelcomeEmailListener類中,sendWelcomeEmail方法使用@EventListener注解標(biāo)記,當(dāng)UserRegisteredEvent事件被發(fā)布時(shí),該方法就會(huì)被調(diào)用,從而實(shí)現(xiàn)發(fā)送歡迎郵件的邏輯。
4.事件監(jiān)聽器的靈活性和配置
- 監(jiān)聽多個(gè)事件:一個(gè)@EventListener注解的方法可以監(jiān)聽多個(gè)事件??梢酝ㄟ^(guò)方法參數(shù)的類型來(lái)指定要監(jiān)聽的事件。例如:
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class MultipleEventListener {
@EventListener
public void handleEvents(UserRegisteredEvent userEvent, OrderPlacedEvent orderEvent) {
if (userEvent!= null) {
System.out.println("處理用戶注冊(cè)事件");
// 用戶注冊(cè)事件相關(guān)邏輯
}
if (orderEvent!= null) {
System.out.println("處理訂單放置事件");
// 訂單放置事件相關(guān)邏輯
}
}
}
- 在這個(gè)例子中,handleEvents方法可以同時(shí)監(jiān)聽UserRegisteredEvent和OrderPlacedEvent事件,根據(jù)傳入的參數(shù)類型來(lái)區(qū)分是哪個(gè)事件,并執(zhí)行相應(yīng)的邏輯。
- 異步監(jiān)聽事件:可以通過(guò)配置讓事件監(jiān)聽器以異步方式執(zhí)行,提高應(yīng)用程序的性能和響應(yīng)速度。在 Spring Boot 中,可以通過(guò)@EnableAsync注解來(lái)啟用異步支持,然后在@EventListener注解中添加async = true屬性。例如:
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@Configuration
@EnableAsync
public class AsyncConfig {
// 配置類內(nèi)容
}
- 然后在監(jiān)聽器方法中:
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@Component
public class AsyncEventListener {
@Async
@EventListener
public void handleAsyncEvent(UserRegisteredEvent event) {
// 異步執(zhí)行的邏輯,如發(fā)送短信通知等,不會(huì)阻塞主線程
System.out.println("異步處理用戶注冊(cè)事件");
}
}
5.SpringBoot內(nèi)置的監(jiān)聽器
- Spring中內(nèi)置監(jiān)聽器例如:ApplicationReadyEvent監(jiān)聽器、ApplicationStartedEvent監(jiān)聽器、ServletWebServerInitializedEvent監(jiān)聽器等。這些監(jiān)聽器可以通過(guò)實(shí)現(xiàn) ApplicationListenner<> 泛型接口 泛型參數(shù)必須是 ApplicationEvent本身或者子類。
- 在這個(gè)例子中實(shí)現(xiàn)了 ApplicationReadyEvent 監(jiān)聽器,ApplicationReadyEvent是 Spring Boot 中一個(gè)非常重要的事件。它在 Spring 應(yīng)用程序完全準(zhǔn)備好接收請(qǐng)求之后觸發(fā),這意味著所有的 Spring bean 都已經(jīng)被初始化,配置文件已經(jīng)加載,并且應(yīng)用程序上下文已經(jīng)完全刷新。
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class ApplicationReadyEventListener implements ApplicationListener<ApplicationReadyEvent> {
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
System.out.println("應(yīng)用程序已準(zhǔn)備好,可以開始接收請(qǐng)求啦!");
// 在這里可以進(jìn)行數(shù)據(jù)庫(kù)連接檢查、緩存預(yù)熱等操作
// 例如,這里加載一些redis緩存啦。什么什么的.......
}
}到此這篇關(guān)于SpringBoot事件監(jiān)聽器@EventListener的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot @EventListener內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java BigDecimal詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
BigDecimal 由任意精度的整數(shù)非標(biāo)度值 和32 位的整數(shù)標(biāo)度 (scale) 組成。接下來(lái)通過(guò)本文給大家介紹Java BigDecimal詳解,需要的的朋友參考下吧2017-04-04
談?wù)凧ava中對(duì)象,類和this,super,static關(guān)鍵字的使用
對(duì)象:對(duì)象是類的一個(gè)實(shí)例,有狀態(tài)和行為。類:類是一個(gè)模板,它描述一類對(duì)象的行為和狀態(tài)。本文就來(lái)和大家聊聊Java中對(duì)象,類和關(guān)鍵字的使用,需要的可以參考一下2022-08-08
java實(shí)現(xiàn)簡(jiǎn)單的搜索引擎
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單的搜索引擎的相關(guān)資料,需要的朋友可以參考下2016-02-02
在IntelliJ IDEA中創(chuàng)建和運(yùn)行java/scala/spark程序的方法
這篇文章主要介紹了在IntelliJ IDEA中創(chuàng)建和運(yùn)行java/scala/spark程序的教程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
IDEA設(shè)置JVM運(yùn)行參數(shù)的方法步驟
這篇文章主要介紹了IDEA設(shè)置JVM運(yùn)行參數(shù)的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
一文搞懂如何實(shí)現(xiàn)Java,Spring動(dòng)態(tài)啟停定時(shí)任務(wù)
定時(shí)任務(wù)的應(yīng)用場(chǎng)景十分廣泛,如定時(shí)清理文件、定時(shí)生成報(bào)表、定時(shí)數(shù)據(jù)同步備份等。本文將教你實(shí)現(xiàn)Java、Spring動(dòng)態(tài)啟停定時(shí)任務(wù),感興趣的可以學(xué)習(xí)一下2022-06-06

