生命週期事件
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 對映的可用回撥的描述。
| 事件 | 釋出時間 |
|---|---|
在聚合根被刪除之前。 |
|
在聚合根被刪除之後。 |
|
在聚合根轉換為執行 SQL 語句的計劃之前,但在決定聚合是新的還是已存在的之後(即是否進行更新或插入)。 |
|
在聚合根儲存之前(即插入或更新之前,但在決定是插入還是更新之後)。 |
|
在聚合根儲存之後(即插入或更新之後)。 |
|
在從資料庫 |
生命週期事件依賴於 ApplicationEventMulticaster,在 SimpleApplicationEventMulticaster 的情況下,可以配置 TaskExecutor,因此不保證事件何時處理。 |
特定於儲存的 EntityCallbacks
Spring Data JDBC 使用 EntityCallback API 來支援審計,並對下表中列出的回撥做出反應。
| 過程 | EntityCallback / 過程步驟 |
註釋 |
|---|---|---|
刪除 |
在實際刪除之前。 |
|
聚合根及其所有實體都將從資料庫中刪除。 |
||
在聚合刪除之後。 |
||
儲存 |
根據聚合是否為新聚合來確定是執行插入還是更新。 |
|
如果您想以程式設計方式設定 ID,這是一個正確的 Callback。在上一步中,新的聚合被檢測到,並且在此步驟中生成的 ID 將在下一步中使用。 |
||
將聚合轉換為聚合更改,它是一系列要針對資料庫執行的 SQL 語句。在此步驟中,決定是否由聚合提供 ID,或者 ID 是否仍然為空並預期由資料庫生成。 |
||
對聚合根所做的更改可能會被考慮,但 ID 值是否會發送到資料庫的決定已在上一步中做出。請勿將其用於為新聚合建立 ID。請改用 |
||
上面確定的 SQL 語句將針對資料庫執行。 |
||
在聚合根儲存之後(即插入或更新之後)。 |
||
載入 |
使用 1 個或多個 SQL 查詢載入聚合。從結果集中構建聚合。 |
|
我們鼓勵使用回撥而不是事件,因為它們支援使用不可變類,因此比事件更強大和通用。