事件

REST 导出器在处理实体的过程中会发出八种不同的事件

  • BeforeCreateEvent

  • AfterCreateEvent

  • BeforeSaveEvent

  • AfterSaveEvent

  • BeforeLinkSaveEvent

  • AfterLinkSaveEvent

  • BeforeDeleteEvent

  • AfterDeleteEvent

编写 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 事件或跨越到线程)。