欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

Spring Boot 監(jiān)聽(tīng)器(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)聽(tīng)器類型

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

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

方式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)聽(tīng)到 OrderCreateEvent...");
        }
        if (event instanceof MyEvent) {
            log.info("監(jiān)聽(tīng)到 MyEvent...");
            MyEvent myEvent = (MyEvent) event;
            System.out.println("時(shí)間:" + myEvent.getTime() + " 信息:" + myEvent.getMsg());
        }
    }
}

高級(jí)配置

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

    @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í)行
}

條件過(guò)濾

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

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

相關(guān)文章

  • @ComponentScan在spring中無(wú)效的原因分析及解決方案

    @ComponentScan在spring中無(wú)效的原因分析及解決方案

    這篇文章主要介紹了@ComponentScan在spring中無(wú)效的原因分析及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot實(shí)現(xiàn)接口參數(shù)加密解密的示例代碼

    SpringBoot實(shí)現(xiàn)接口參數(shù)加密解密的示例代碼

    加密解密本身并不是難事,問(wèn)題是在何時(shí)去處理?SpringMVC?中給我們提供了?ResponseBodyAdvice?和?RequestBodyAdvice,利用這兩個(gè)工具可以對(duì)請(qǐng)求和響應(yīng)進(jìn)行預(yù)處理,非常方便。廢話不多說(shuō),我們一起來(lái)學(xué)習(xí)一下
    2022-09-09
  • Spring boot按日切分spring boot的nohup.out日志文件的方法

    Spring boot按日切分spring boot的nohup.out日志文件的方法

    過(guò)大的日志文件維護(hù)起來(lái)存在諸多問(wèn)題,所以最好是能夠按日或按大小切分日志文件,下面小編給大家?guī)?lái)了Spring boot按日切分spring boot的nohup.out日志文件的方法,一起看看吧
    2018-08-08
  • Java11中基于嵌套關(guān)系的訪問(wèn)控制優(yōu)化詳解

    Java11中基于嵌套關(guān)系的訪問(wèn)控制優(yōu)化詳解

    Java(和其他語(yǔ)言)通過(guò)內(nèi)部類支持嵌套類,要使其正常工作,需要編譯器執(zhí)行一些技巧,下面這篇文章主要給大家介紹了關(guān)于Java11中基于嵌套關(guān)系的訪問(wèn)控制優(yōu)化的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Java 獲取本機(jī)的IP與MAC地址實(shí)現(xiàn)詳解

    Java 獲取本機(jī)的IP與MAC地址實(shí)現(xiàn)詳解

    這篇文章主要介紹了Java 獲取本機(jī)的IP與MAC地址實(shí)現(xiàn)詳解的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • javaweb中Filter(過(guò)濾器)的常見(jiàn)應(yīng)用

    javaweb中Filter(過(guò)濾器)的常見(jiàn)應(yīng)用

    這篇文章主要介紹了javaweb中Filter的常見(jiàn)應(yīng)用,過(guò)濾器的使用方法,感興趣的小伙伴們可以參考一下
    2015-12-12
  • IDEA 2020代碼提示忽略大小寫的問(wèn)題

    IDEA 2020代碼提示忽略大小寫的問(wèn)題

    這篇文章主要介紹了IDEA 2020代碼提示忽略大小寫的問(wèn)題,本文通過(guò)圖文并茂的形式給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • IntelliJ IDEA 2019.2 x64的安裝、應(yīng)用與簡(jiǎn)單配置(圖文)

    IntelliJ IDEA 2019.2 x64的安裝、應(yīng)用與簡(jiǎn)單配置(圖文)

    這篇文章主要介紹了IntelliJ IDEA 2019.2 x64的安裝、應(yīng)用與簡(jiǎn)單配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • SpringBoot @ControllerAdvice 攔截異常并統(tǒng)一處理

    SpringBoot @ControllerAdvice 攔截異常并統(tǒng)一處理

    這篇文章主要介紹了SpringBoot @ControllerAdvice 攔截異常并統(tǒng)一處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 詳談ServiceLoader實(shí)現(xiàn)原理

    詳談ServiceLoader實(shí)現(xiàn)原理

    下面小編就為大家?guī)?lái)一篇詳談ServiceLoader實(shí)現(xiàn)原理。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02

最新評(píng)論