事件
REST 匯出器在處理實體的過程中會發出八種不同的事件
編寫 ApplicationListener
您可以繼承一個抽象類,該類監聽這些型別的事件,並根據事件型別呼叫適當的方法。 要做到這一點,請覆蓋有問題的事件的方法,如下所示
public class BeforeSaveEventListener extends AbstractRepositoryEventListener {
@Override
public void onBeforeSave(Object entity) {
... logic to handle inspecting the entity before the Repository saves it
}
@Override
public void onAfterDelete(Object entity) {
... send a message that this entity has been deleted
}
}
但是,使用此方法需要注意的一點是,它不會根據實體的型別進行區分。 您必須自己檢查。
編寫帶註釋的處理程式
另一種方法是使用帶註釋的處理程式,該處理程式根據域型別過濾事件。
要宣告處理程式,請建立一個 POJO 並在其上放置 @RepositoryEventHandler
註釋。 這告訴 BeanPostProcessor
需要檢查此類以查詢處理程式方法。
一旦 BeanPostProcessor
找到帶有此註釋的 bean,它就會迭代公開的方法並查詢與有問題的事件相對應的註釋。 例如,要在帶註釋的 POJO 中為不同型別的域型別處理 BeforeSaveEvent
例項,您可以將您的類定義如下
@RepositoryEventHandler (1)
public class PersonEventHandler {
@HandleBeforeSave
public void handlePersonSave(Person p) {
// … you can now deal with Person in a type-safe way
}
@HandleBeforeSave
public void handleProfileSave(Profile p) {
// … you can now deal with Profile in a type-safe way
}
}
1 | 可以透過使用 (例如) @RepositoryEventHandler(Person.class) 來縮小此處理程式適用的型別。 |
您感興趣的事件的域型別由帶註釋的方法的第一個引數的型別確定。
要註冊您的事件處理程式,請使用 Spring 的 @Component
構造型之一標記該類(以便可以透過 @SpringBootApplication
或 @ComponentScan
拾取它),或者在您的 ApplicationContext
中宣告帶註釋的 bean 的例項。 然後,在 RepositoryRestMvcConfiguration
中建立的 BeanPostProcessor
檢查 bean 以查詢處理程式,並將它們連線到正確的事件。 以下示例演示瞭如何為 Person
類建立事件處理程式
@Configuration
public class RepositoryConfiguration {
@Bean
PersonEventHandler personEventHandler() {
return new PersonEventHandler();
}
}
Spring Data REST 事件是自定義的 Spring 應用程式事件。 預設情況下,Spring 事件是同步的,除非它們跨邊界重新發布(例如發出 WebSocket 事件或進入執行緒)。 |