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