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

Spring Boot 監(jiān)聽器Listeners詳細(xì)教程(最新整理)

 更新時(shí)間:2025年07月15日 10:51:21   作者:twj_one  
SpringBoot監(jiān)聽器基于Spring事件機(jī)制,用于響應(yīng)應(yīng)用狀態(tài)變化,內(nèi)置事件涵蓋啟動(dòng)、關(guān)閉等生命周期,支持自定義事件定義,本文給大家介紹Spring Boot 監(jiān)聽器Listeners詳細(xì)教程,感興趣的朋友一起看看吧

Spring Boot 監(jiān)聽器概述

Spring Boot 監(jiān)聽器(Listeners)基于 Spring Framework 的事件機(jī)制(ApplicationEvent 和 ApplicationListener),用于在應(yīng)用生命周期或自定義事件觸發(fā)時(shí)執(zhí)行特定邏輯。它們提供了一種松耦合的方式響應(yīng)應(yīng)用狀態(tài)變化,常用于初始化資源、監(jiān)控應(yīng)用狀態(tài)、執(zhí)行異步任務(wù)等。

概念

事件類型

  • 內(nèi)置系統(tǒng)事件:
  • ContextRefreshedEvent: ApplicationContext初始化或刷新時(shí)觸發(fā)
  • ContextStartedEvent: ApplicationContext啟動(dòng)后觸發(fā)
  • ContextStoppedEvent: ApplicationContext停止后觸發(fā)
  • ContextClosedEvent: ApplicationContext關(guān)閉后觸發(fā)
  • ApplicationStartedEvent: Spring Boot應(yīng)用啟動(dòng)后觸發(fā)
  • ApplicationReadyEvent: 應(yīng)用準(zhǔn)備就緒時(shí)觸發(fā)(推薦在此執(zhí)行啟動(dòng)邏輯)
  • ApplicationFailedEvent: 啟動(dòng)失敗時(shí)觸發(fā)
  • 自定義事件: 繼承ApplicationEvent創(chuàng)建特定業(yè)務(wù)事件

監(jiān)聽器類型

接口實(shí)現(xiàn): 實(shí)現(xiàn)ApplicationListener
注解驅(qū)動(dòng): 使用@EventListener注解方法
SmartApplicationListener: 支持事件類型過濾和順序控制
簡(jiǎn)單說就是:

  • 事件(Event): 繼承 ApplicationEvent 的類,表示一個(gè)事件(如應(yīng)用啟動(dòng)、關(guān)閉等)。
  • 監(jiān)聽器(Listener): 實(shí)現(xiàn) ApplicationListener 接口、SmartApplicationListener接口或使用 @EventListener注解的組件,用于響應(yīng)事件。
  • 事件發(fā)布(Publisher): 通過 ApplicationEventPublisher 發(fā)布事件。

最佳使用場(chǎng)景

自定義事件

步驟1:定義事件類

public class OrderCreateEvent extends ApplicationEvent {
    private String orderId;
    public OrderCreateEvent(Object source, String orderId) {
        super(source);
        this.orderId = orderId;
    }
    public String getOrderId() {
        return orderId;
    }
}

步驟2:發(fā)布事件

@Service
public class OrderService {
    @Autowired
    private ApplicationEventPublisher eventPublisher;
    public void createOrder(Order order) {
        // 創(chuàng)建訂單邏輯...
        eventPublisher.publishEvent(new OrderCreateEvent(this, order.getId()));
    }
}

事件監(jiān)聽

方式1:實(shí)現(xiàn)ApplicationListener接口

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
public class SystemStartupListener implements ApplicationListener<ApplicationReadyEvent> {
    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        System.out.println("=== 應(yīng)用啟動(dòng)完成,執(zhí)行初始化操作 ===");
        // 初始化業(yè)務(wù)數(shù)據(jù)...
    }
}
public class OrderCreateEventListener implements ApplicationListener<OrderCreateEvent> {
    @Override
    public void onApplicationEvent(OrderCreateEvent event) {
        System.out.println("=== 執(zhí)行操作 ===");
        // 初始化業(yè)務(wù)數(shù)據(jù)...
    }
}

方式2:使用@EventListener注解

import org.springframework.context.event.EventListener;
import org.springframework.boot.context.event.ApplicationStartedEvent;
@Component
public class AnnotationBasedListener {
    @EventListener
    public void handleStartedEvent(ApplicationStartedEvent event) {
        System.out.println("=== 應(yīng)用啟動(dòng)事件捕獲 ===");
    }
}
@Component
public class AnnotationBasedListener {
    @EventListener
    public void handleStartedEvent(OrderCreateEvent event) {
        System.out.println("=== 執(zhí)行操作 ===");
    }
}

方式3:實(shí)現(xiàn)SmartApplicationListener接口

@Slf4j
@Component
public class MyTask implements SmartApplicationListener {
    @Override
    public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        return eventType == MyEvent.class || eventType == OrderCreateEvent.class;
    }
    @Override
    public int getOrder() {
        return 0;
    }
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof OrderCreateEvent) {
            log.info("監(jiān)聽到 OrderCreateEvent...");
        }
        if (event instanceof MyEvent) {
            log.info("監(jiān)聽到 MyEvent...");
            MyEvent myEvent = (MyEvent) event;
            System.out.println("時(shí)間:" + myEvent.getTime() + " 信息:" + myEvent.getMsg());
        }
    }
}

高級(jí)配置

監(jiān)聽器順序控制

    @EventListener
    @Order(Ordered.HIGHEST_PRECEDENCE) // 最高優(yōu)先級(jí)
    public void handleOrderEvent(OrderCreateEvent event) {
        System.out.println("收到訂單創(chuàng)建事件,訂單ID:" + event.getOrderId());
        // 發(fā)送通知、更新統(tǒng)計(jì)...
    }

異步事件處理

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.initialize();
        return executor;
    }
}
// 可進(jìn)行如下替換
@EventListener
@Async
public void asyncHandleEvent(MyEvent event) {
    // 異步執(zhí)行
}

條件過濾

@EventListener(condition = "#event.orderId.startsWith('VIP')")
public void handleVipOrder(OrderCreateEvent event) {
    // 只處理VIP訂單
}

到此這篇關(guān)于Spring Boot 監(jiān)聽器Listeners詳細(xì)教程的文章就介紹到這了,更多相關(guān)Spring Boot 監(jiān)聽器Listeners內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot常用語法庫的基本語法

    springboot常用語法庫的基本語法

    FreeMarker 是一款?模板引擎: 即一種基于模板和要改變的數(shù)據(jù), 并用來生成輸出文本(HTML網(wǎng)頁,電子郵件,配置文件,源代碼等)的通用工具,這篇文章主要介紹了springboot常用語法庫的基本語法,需要的朋友可以參考下
    2022-12-12
  • Springboot Caffeine本地緩存使用示例

    Springboot Caffeine本地緩存使用示例

    這篇文章主要介紹了Springboot Caffeine本地緩存使用示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java抽象的本質(zhì)解析

    Java抽象的本質(zhì)解析

    對(duì)于面向?qū)ο缶幊虂碚f,抽象是它的一大特征之一,在 Java 中可以通過兩種形式來體現(xiàn)OOP的抽象:接口和抽象類,下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)抽象的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • Java集合之LinkedHashSet詳解

    Java集合之LinkedHashSet詳解

    這篇文章主要介紹了Java集合之LinkedHashSet詳解,LinkedHashSet是HashSet的子類,實(shí)現(xiàn)了Set接口,LinkedHashSet底層是一個(gè)LinkedHashMap,底層維護(hù)了一個(gè)數(shù)組+雙向鏈表,需要的朋友可以參考下
    2023-09-09
  • 老生常談Java虛擬機(jī)垃圾回收機(jī)制(必看篇)

    老生常談Java虛擬機(jī)垃圾回收機(jī)制(必看篇)

    下面小編就為大家?guī)硪黄仙U凧ava虛擬機(jī)垃圾回收機(jī)制(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • MybatisPlus使用queryWrapper如何實(shí)現(xiàn)復(fù)雜查詢

    MybatisPlus使用queryWrapper如何實(shí)現(xiàn)復(fù)雜查詢

    這篇文章主要介紹了MybatisPlus使用queryWrapper如何實(shí)現(xiàn)復(fù)雜查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • 詳解如何給SpringBoot部署的jar包瘦身

    詳解如何給SpringBoot部署的jar包瘦身

    這篇文章主要介紹了如何給SpringBoot部署的jar包瘦身,如今迭代發(fā)布是常有的事情,每次都上傳一個(gè)如此龐大的文件,會(huì)浪費(fèi)很多時(shí)間,接下來小編就以一個(gè)小項(xiàng)目為例,來演示如何給jar包瘦身,需要的朋友可以參考下
    2023-07-07
  • Java多線程的實(shí)現(xiàn)方式比較(兩種方式比較)

    Java多線程的實(shí)現(xiàn)方式比較(兩種方式比較)

    Java多線程實(shí)現(xiàn)方式有兩種,第一種是繼承Thread類,第二種是實(shí)現(xiàn)Runnable接口,兩種有很多差異,下面跟著本文一起學(xué)習(xí)吧
    2015-11-11
  • 詳解Java二叉排序樹

    詳解Java二叉排序樹

    這篇文章主要介紹了Java二叉排序樹,包括二叉排序樹的定義、二叉排序樹的性質(zhì)、二叉排序樹的插入和查找等,感興趣的小伙伴們可以參考一下
    2015-12-12
  • Java中java.sql.SQLException異常的正確解決方法(親測(cè)有效!)

    Java中java.sql.SQLException異常的正確解決方法(親測(cè)有效!)

    SQLException是在Java中處理數(shù)據(jù)庫操作過程中可能發(fā)生的異常,通常是由于底層數(shù)據(jù)庫操作錯(cuò)誤或違反了數(shù)據(jù)庫規(guī)則而引起的,下面這篇文章主要給大家介紹了關(guān)于Java中java.sql.SQLException異常的正確解決方法,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

桑植县| 河津市| 池州市| 柳州市| 克什克腾旗| 罗平县| 翼城县| 布拖县| 阜南县| 奉化市| 资源县| 共和县| 文安县| 塘沽区| 公主岭市| 凤山县| 达拉特旗| 遂昌县| 定陶县| 温州市| 武宁县| 拉孜县| 西青区| 温泉县| 滦平县| 海原县| 娱乐| 武威市| 荣昌县| 咸丰县| 黄龙县| 高雄市| 宜川县| 吴江市| 德保县| 砀山县| 托克逊县| 廉江市| 池州市| 砚山县| 浮梁县|