最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring @EventListener 事件與監(jiān)聽(tīng)的示例詳解

 更新時(shí)間:2025年03月05日 11:38:17   作者:xixingzhe2  
本文介紹了自定義Spring事件和監(jiān)聽(tīng)器的方法,包括如何發(fā)布事件、監(jiān)聽(tīng)事件以及如何處理異步事件,通過(guò)示例代碼和日志,展示了事件的順序執(zhí)行和異步處理機(jī)制,感興趣的朋友一起看看吧

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)原理及其配置

    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
  • 詳解mybatis @SelectProvider 注解

    詳解mybatis @SelectProvider 注解

    這篇文章主要介紹了mybatis @SelectProvider 注解的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-12-12
  • SpringBoot yml配置敏感信息加密的實(shí)現(xiàn)

    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
  • Java中的鎖分類(lèi)的詳細(xì)介紹

    Java中的鎖分類(lèi)的詳細(xì)介紹

    這篇文章主要介紹了Java中的鎖分類(lèi)的詳細(xì)介紹,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Spring事務(wù)事件監(jiān)控的實(shí)現(xiàn)

    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使用示例

    這篇文章主要介紹了Java的字符讀寫(xiě)類(lèi)CharArrayReader和CharArrayWriter使用示例,兩個(gè)類(lèi)分別繼承于Reader和Writer,需要的朋友可以參考下
    2016-06-06
  • JavaAgent原理及實(shí)踐分享

    JavaAgent原理及實(shí)踐分享

    這篇文章主要介紹了JavaAgent原理及實(shí)踐,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • java poi sax方式處理大數(shù)據(jù)量excel文件

    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)熱部署的三種方式

    本文主要介紹了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è)置表格顏色功能

    基于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

最新評(píng)論

本溪市| 塘沽区| 封开县| 石狮市| 呼图壁县| 浏阳市| 晋中市| 铁岭市| 上栗县| 望谟县| 两当县| 华阴市| 曲阳县| 同仁县| 宜城市| 梧州市| 鹤峰县| 本溪市| 拉萨市| 米脂县| 阿克苏市| 鲜城| 河津市| 沽源县| 诸城市| 沙洋县| 靖边县| 大余县| 苏州市| 邢台市| 子洲县| 汝阳县| 蒲江县| 乳山市| 肥东县| 灵山县| 沽源县| 肇州县| 固原市| 卓资县| 庐江县|