生命週期事件

Spring Data JDBC 將生命週期事件釋出到 ApplicationListener 物件,這些物件通常是應用程式上下文中的 bean。事件是關於特定生命週期階段的通知。與實體回撥不同,事件旨在用於通知。事務偵聽器將在事務完成時接收事件。事件和回撥僅針對聚合根觸發。如果您想處理非根實體,則需要透過包含聚合根的偵聽器進行處理。

實體生命週期事件可能代價高昂,在載入大量結果集時,您可能會注意到效能配置檔案發生變化。您可以在模板 API 上停用生命週期事件。

例如,在聚合儲存之前會呼叫以下偵聽器

@Bean
ApplicationListener<BeforeSaveEvent<Object>> loggingSaves() {

    return event -> {

        Object entity = event.getEntity();
        LOG.info("{} is getting saved.", entity);
    };
}

如果您只想處理特定域型別的事件,您可以從 AbstractRelationalEventListener 派生偵聽器並覆蓋一個或多個 onXXX 方法,其中 XXX 代表事件型別。回撥方法將僅針對與域型別及其子型別相關的事件呼叫,因此您不需要進一步的型別轉換。

class PersonLoadListener extends AbstractRelationalEventListener<Person> {

    @Override
    protected void onAfterLoad(AfterLoadEvent<Person> personLoad) {
		LOG.info(personLoad.getEntity());
    }
}

下表描述了可用事件。有關過程步驟之間確切關係的更多詳細資訊,請參閱與事件 1:1 對映的可用回撥的描述

表 1. 可用事件
事件 釋出時間

BeforeDeleteEvent

在聚合根被刪除之前。

AfterDeleteEvent

在聚合根被刪除之後。

BeforeConvertEvent

在聚合根轉換為執行 SQL 語句的計劃之前,但在決定聚合是新的還是已存在的之後(即是否進行更新或插入)。

BeforeSaveEvent

在聚合根儲存之前(即插入或更新之前,但在決定是插入還是更新之後)。

AfterSaveEvent

在聚合根儲存之後(即插入或更新之後)。

AfterConvertEvent

在從資料庫 ResultSet 建立聚合根並設定其所有屬性之後。

生命週期事件依賴於 ApplicationEventMulticaster,在 SimpleApplicationEventMulticaster 的情況下,可以配置 TaskExecutor,因此不保證事件何時處理。

特定於儲存的 EntityCallbacks

Spring Data JDBC 使用 EntityCallback API 來支援審計,並對下表中列出的回撥做出反應。

表 2. Spring Data JDBC 執行的不同過程的步驟和回撥。
過程 EntityCallback / 過程步驟 註釋

刪除

BeforeDeleteCallback

在實際刪除之前。

聚合根及其所有實體都將從資料庫中刪除。

AfterDeleteCallback

在聚合刪除之後。

儲存

根據聚合是否為新聚合來確定是執行插入還是更新。

BeforeConvertCallback

如果您想以程式設計方式設定 ID,這是一個正確的 Callback。在上一步中,新的聚合被檢測到,並且在此步驟中生成的 ID 將在下一步中使用。

將聚合轉換為聚合更改,它是一系列要針對資料庫執行的 SQL 語句。在此步驟中,決定是否由聚合提供 ID,或者 ID 是否仍然為空並預期由資料庫生成。

BeforeSaveCallback

對聚合根所做的更改可能會被考慮,但 ID 值是否會發送到資料庫的決定已在上一步中做出。請勿將其用於為新聚合建立 ID。請改用 BeforeConvertCallback

上面確定的 SQL 語句將針對資料庫執行。

AfterSaveCallback

在聚合根儲存之後(即插入或更新之後)。

載入

使用 1 個或多個 SQL 查詢載入聚合。從結果集中構建聚合。

AfterConvertCallback

我們鼓勵使用回撥而不是事件,因為它們支援使用不可變類,因此比事件更強大和通用。

© . This site is unofficial and not affiliated with VMware.