知識庫 / Spring RSS 訂閱

Spring 應用上下文事件

Spring
HongKong
2
01:42 PM · Dec 06 ,2025

1. 簡介

在本教程中,我們將學習 Spring 框架提供的事件支持機制。我們將探索框架提供的各種內置事件,然後看看如何消費事件。

要了解如何創建和發佈自定義事件,請查看我們的上一篇教程這裏

Spring 具有事件機制,該機制圍繞着 ApplicationContext 構建的。它可用於 在不同的 Bean 之間交換信息。我們可以通過監聽事件並執行自定義代碼來利用應用程序事件。

例如,一個場景是執行在 ApplicationContext 完整啓動時自定義邏輯。

2. 標準上下文事件

實際上,Spring 提供了多種內置事件,這些事件允許開發者鈎入應用程序和上下文的生命週期,並執行自定義操作

即使我們很少手動在應用程序中使用這些事件,但框架在自身內部大量使用它們。讓我們先探索 Spring 中各種內置事件。

2.1. <em >ContextRefreshedEvent</em>

當初始化或刷新 <em >ApplicationContext</em> 時,Spring 會引發 <em >ContextRefreshedEvent</em>。 通常,刷新操作可以被觸發多次,只要上下文沒有關閉。

請注意,我們也可以通過調用 <em >ConfigurableApplicationContext</em> 接口上的 <em >refresh()</em> 方法來手動觸發該事件。

2.2. <em>ContextStartedEvent</em>

通過調用 <em>ConfigurableApplicationContext</em><em>start()</em> 方法,我們觸發此事件並啓動 `ApplicationContext。事實上,該方法通常用於在明確停止後重啓 Bean。我們還可以使用該方法處理沒有自動啓動配置的組件。

這裏需要注意的是,調用 <em>start()</em> 始終是顯式的,與 <em>refresh()</em> 不同。

2.3. 上下文停止事件 (ContextStoppedEvent)

ApplicationContext 被停止時,通過調用 ConfigurableApplicationContextstop() 方法發佈 ContextStoppedEvent。 如前所述,可以使用 start() 方法來重啓已停止的事件。

2.4. <em >ContextClosedEvent</em>

此事件在 <em >ConfigurableApplicationContext</em><em >close()</em> 方法中發佈,當 <em >ApplicationContext</em> 關閉時發佈。

實際上,在關閉上下文後,我們無法重啓它。

上下文在關閉時達到生命終點,因此無法像 <em >ContextStoppedEvent</em> 那樣重啓。

3. <em @EventListener

接下來,讓我們探討如何消費已發佈事件。從 4.2 版本開始,Spring 支持基於註解的事件監聽器 – <em @EventListener。

特別是,我們可以利用此註解自動註冊一個基於方法簽名的 <em ApplicationListener:

@EventListener
public void handleContextRefreshEvent(ContextStartedEvent ctxStartEvt) {
    System.out.println("Context Start Event received.");
}

意義重大的是,@EventListener是一個核心註解,因此不需要任何額外的配置。事實上,現有的<<context:annotation-driven/>元素已經提供了完全的支持。

標註了@EventListener 的方法可以返回非空類型。如果返回的值非空,事件機制將會發佈一個新的事件。

3.1. 監聽多個事件

現在,在某些情況下,我們需要監聽器消費多個事件。

對於這種情況,我們可以利用 <a href="https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/event/EventListener.html#classes">類</a> 屬性:

@EventListener(classes = { ContextStartedEvent.class, ContextStoppedEvent.class })
public void handleMultipleEvents() {
    System.out.println("Multi-event listener invoked");
}

4. Application Event Listener

如果使用早期版本的 Spring (<<4.2>),則需要引入自定義的 ApplicationEventListener 並覆蓋 onApplicationEvent 方法來監聽事件。

5. 結論

在本文中,我們探討了 Spring 中各種內置事件。此外,我們還看到了監聽這些事件的各種方法。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.