spring @EventListener 事件與監(jiān)聽(tīng)的示例詳解
1、自定義Application Event
package com.ybw.event.pojo;
import lombok.Getter;
import lombok.Setter;
import org.springframework.context.ApplicationEvent;
/**
* @className MyEvent
* @author weixiansheng
* @date 2023/9/28
* @version V1.0
**/
@Setter
@Getter
public class MyEvent extends ApplicationEvent {
private String data;
public MyEvent(Object source, String data) {
super(source);
this.data = data;
}
}2、自定義監(jiān)聽(tīng)
package com.ybw.event.listener;
import com.ybw.event.pojo.MyEvent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
/**
* 簡(jiǎn)單監(jiān)聽(tīng)
*
* @author weixiansheng
* @version V1.0
* @className MySimpleListener
* @date 2023/9/28
**/
@Component
@Slf4j
public class MySimpleListener {
/**
* @param event
* @methodName: handleDemoEvent
* @return: void
* @author: weixiansheng
* @date: 2023/9/28
**/
@EventListener
public void handleDemoEvent(MyEvent event) {
log.info("發(fā)布的data為:{}", event.getData());
}
}3、測(cè)試
package com.ybw.event.listener;
import com.ybw.event.pojo.MyEvent;
import com.ybw.util.SpringContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.concurrent.TimeUnit;
/**
* @author weixiansheng
* @version V1.0
* @className MySimpleListenerTest
* @date 2023/9/28
**/
@SpringBootTest
@Slf4j
class MySimpleListenerTest {
/**
* 發(fā)布消息
*
* @methodName: publishEvent
* @return: void
* @author: weixiansheng
* @date: 2023/9/28
**/
@Test
public void publishEvent() throws InterruptedException {
log.info("publishEvent start");
SpringContextHolder.publishEvent(new MyEvent(this, "測(cè)試"));
log.info("publishEvent end");
TimeUnit.DAYS.sleep(1);
}
}打印日志
[INFO ] 2023-09-28 10:19:15.312 [main] c.y.e.listener.MySimpleListenerTest - publishEvent start
[INFO ] 2023-09-28 10:19:16.344 [main] c.y.event.listener.MySimpleListener - 發(fā)布的data為:測(cè)試
[INFO ] 2023-09-28 10:19:16.347 [main] c.y.e.listener.MySimpleListenerTest - publishEvent end
4、源代碼
share: 分享倉(cāng)庫(kù) - Gitee.com
5、其他
5.1 順序執(zhí)行
使用注解
- @Order order的值越小,優(yōu)先級(jí)越高。
- order如果不標(biāo)注數(shù)字,默認(rèn)最低優(yōu)先級(jí),因?yàn)槠淠J(rèn)值是int最大值。
示例
/**
* 普通監(jiān)聽(tīng)
*
* @param event
* @methodName: handleDemoEvent
* @return: void
* @author: weixiansheng
* @date: 2023/9/28
**/
@EventListener
@Order(2)
public void handleEvent(MyEvent event) throws InterruptedException {
TimeUnit.SECONDS.sleep(1);
log.info("handleEvent data:{}", event.getData());
}
/**
* 條件監(jiān)聽(tīng)
*
* @param event
* @methodName: handleConditionEvent
* @return: void
* @author: weixiansheng
* @date: 2023/9/28
**/
@EventListener(condition = "#event.data=='張三'")
@Order(1)
public void handleConditionEvent(MyEvent event) {
log.info("handleConditionEvent data:{}", event.getData());
}打印日志
[INFO ] 2023-09-28 10:40:22.206 [main] c.y.event.listener.MySimpleListener - handleConditionEvent data:張三
[INFO ] 2023-09-28 10:40:23.216 [main] c.y.event.listener.MySimpleListener - handleEvent data:張三
5.2 異步支持
Spring 事件機(jī)制默認(rèn)是同步阻塞的,如果 ApplicationEventPublisher 發(fā)布事件之后他會(huì)一直阻塞等待listener 響應(yīng),多個(gè) listener 的情況下前面的沒(méi)有執(zhí)行完后面的會(huì)一直被阻塞。發(fā)布者和訂閱者屬于同一事務(wù),如果訂閱者執(zhí)行失敗了,發(fā)布者事務(wù)會(huì)回滾。
可以利用 Spring 提供的線程池注解 @Async 來(lái)實(shí)現(xiàn)異步線程。異步不影響發(fā)布者的事務(wù)。
示例
/**
* 普通監(jiān)聽(tīng)
*
* @param event
* @methodName: handleDemoEvent
* @return: void
* @author: weixiansheng
* @date: 2023/9/28
**/
@EventListener
public void handleEvent(MyEvent event) throws InterruptedException {
TimeUnit.SECONDS.sleep(1);
log.info("handleEvent data:{}", event.getData());
}
/**
* 條件監(jiān)聽(tīng)
*
* @param event
* @methodName: handleConditionEvent
* @return: void
* @author: weixiansheng
* @date: 2023/9/28
**/
@Async
@EventListener(condition = "#event.data=='張三'")
public void handleConditionEvent(MyEvent event) {
log.info("handleConditionEvent data:{}", event.getData());
}打印日志
[INFO ] 2023-09-28 10:49:40.246 [thread-pool-1] com.ybw.event.listener.MyListener - handleConditionEvent data:張三
[INFO ] 2023-09-28 10:49:41.255 [main] com.ybw.event.listener.MyListener - handleEvent data:張三
一個(gè)是線程thread-pool-1,一個(gè)是線程main。
6、總結(jié)
- 事件模式概念
- 事件:事件的觸發(fā)者,比如用戶注冊(cè)就是事件。
- 事件發(fā)布:描述發(fā)生了什么事情的對(duì)象,比如張三注冊(cè)成功的事件。
- 事件監(jiān)聽(tīng):監(jiān)聽(tīng)到事件發(fā)生的時(shí)候,做一些處理,比如下單后,增加用戶積分。
- Spring中事件監(jiān)聽(tīng)器的處理是同步方式
- 日志都是都一個(gè)線程。
- 執(zhí)行時(shí)順序的,執(zhí)行完監(jiān)聽(tīng)器的業(yè)務(wù)后,會(huì)向下繼續(xù)執(zhí)行后面的邏輯。如上例:publishEvent end。
到此這篇關(guān)于spring @EventListener 事件與監(jiān)聽(tīng)的文章就介紹到這了,更多相關(guān)spring @EventListener 事件與監(jiān)聽(tīng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud中Zuul網(wǎng)關(guān)原理及其配置
Spring?Cloud是一個(gè)基于Spring?Boot實(shí)現(xiàn)的微服務(wù)應(yīng)用開(kāi)發(fā)工具,其中的Zuul網(wǎng)關(guān)可以實(shí)現(xiàn)負(fù)載均衡、路由轉(zhuǎn)發(fā)、鑒權(quán)、限流等功能,本文將從Spring?Cloud中Zuul網(wǎng)關(guān)的原理、使用場(chǎng)景和配置過(guò)程詳細(xì)介紹,幫助大家更好地了解和應(yīng)用Zuul網(wǎng)關(guān),需要的朋友可以參考下2023-06-06
SpringBoot yml配置敏感信息加密的實(shí)現(xiàn)
本文主要介紹了SpringBoot yml配置敏感信息加密的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08
Spring事務(wù)事件監(jiān)控的實(shí)現(xiàn)
這篇文章主要介紹了Spring事務(wù)事件監(jiān)控的實(shí)現(xiàn)。本文首先會(huì)使用實(shí)例進(jìn)行講解Spring事務(wù)事件是如何使用的,然后會(huì)講解這種使用方式的實(shí)現(xiàn)原理。感興趣的小伙伴們可以參考一下2018-10-10
Java的字符讀寫(xiě)類(lèi)CharArrayReader和CharArrayWriter使用示例
這篇文章主要介紹了Java的字符讀寫(xiě)類(lèi)CharArrayReader和CharArrayWriter使用示例,兩個(gè)類(lèi)分別繼承于Reader和Writer,需要的朋友可以參考下2016-06-06
java poi sax方式處理大數(shù)據(jù)量excel文件
這篇文章主要介紹了java poi sax方式處理大數(shù)據(jù)量excel文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
SpringBoot實(shí)現(xiàn)熱部署的三種方式
本文主要介紹了SpringBoot實(shí)現(xiàn)熱部署的三種方式,主要包括配置pom.xml文件,使用插件的執(zhí)行命令mvn spring-boot:run啟動(dòng)項(xiàng),使用springloader本地啟動(dòng)修改jvm參數(shù),使用devtools工具包,感興趣的可以了解一下2023-12-12
基于Vue.js和Ant Design Vue實(shí)現(xiàn)根據(jù)字段內(nèi)容動(dòng)態(tài)設(shè)置表格顏色功能
在前端開(kāi)發(fā)中,表格Table是展示數(shù)據(jù)的常見(jiàn)組件,有時(shí),我們需要根據(jù)表格中某些字段的內(nèi)容動(dòng)態(tài)設(shè)置樣式,例如根據(jù)百分比數(shù)值顯示不同的顏色,以提升數(shù)據(jù)的可讀性和用戶體驗(yàn),本文將詳細(xì)介紹如何基于Vue.js和Ant Design Vue實(shí)現(xiàn)這一功能,并結(jié)合實(shí)際代碼示例進(jìn)行解析2025-06-06

