イベント

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
  }
}

ただし、このアプローチで注意すべきことの 1 つは、エンティティの型に基づいて区別がないことです。それを自分でインスペクションしなければなりません。

アノテーション付きハンドラーの作成

別のアプローチは、ドメイン型に基づいてイベントをフィルタリングするアノテーション付きハンドラーを使用することです。

ハンドラーを宣言するには、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 ステレオタイプの 1 つでクラスをマークするか(@SpringBootApplication または @ComponentScan で取得できるようにするため)、ApplicationContext でアノテーション付き Bean のインスタンスを宣言します。次に、RepositoryRestMvcConfiguration で作成された BeanPostProcessor は、Bean のハンドラーをインスペクションし、正しいイベントに接続します。次の例は、Person クラスのイベントハンドラーを作成する方法を示しています。

@Configuration
public class RepositoryConfiguration {

  @Bean
  PersonEventHandler personEventHandler() {
    return new PersonEventHandler();
  }
}
Spring Data REST イベントはカスタマイズされた Spring アプリケーションイベントです。デフォルトでは、Spring イベントは、境界を越えて再パブリッシュされない限り同期です (WebSocket イベントの発行やスレッドへの移行など)。