最新国产好看的视频,伊人天堂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: 支持事件類型過濾和順序控制
簡單說就是:

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

最佳使用場景

自定義事件

步驟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());
        }
    }
}

高級配置

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

    @EventListener
    @Order(Ordered.HIGHEST_PRECEDENCE) // 最高優(yōu)先級
    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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

    springboot常用語法庫的基本語法

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

    Springboot Caffeine本地緩存使用示例

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

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

    對于面向?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à)值,希望對大家有所幫助。如有錯(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異常的正確解決方法(親測有效!)

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

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

最新評論

磐石市| 卓尼县| 湾仔区| 青阳县| 松潘县| 韶关市| 修水县| 临夏县| 江华| 武山县| 陆丰市| 安康市| 斗六市| 彭阳县| 凤凰县| 齐齐哈尔市| 泸西县| 同德县| 顺义区| 博野县| 雅安市| 美姑县| 高碑店市| 瑞丽市| 永平县| 马鞍山市| 区。| 东明县| 龙泉市| 专栏| 盐津县| 宁波市| 舟山市| 临汾市| 景宁| 松阳县| 佛山市| 金沙县| 佳木斯市| 曲周县| 汝州市|