事件

編寫 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 事件或進入執行緒)。