事件
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
stereotypes 之一标记该类(以便它可以被@SpringBootApplication
或@ComponentScan
拾取),或者在您的ApplicationContext
中声明带注解的 Bean 的实例。然后,在RepositoryRestMvcConfiguration
中创建的BeanPostProcessor
将检查 Bean 的处理程序并将其连接到正确的事件。以下示例演示如何为Person
类创建事件处理器:
@Configuration
public class RepositoryConfiguration {
@Bean
PersonEventHandler personEventHandler() {
return new PersonEventHandler();
}
}
Spring Data REST 事件是自定义的Spring 应用程序事件。默认情况下,Spring 事件是同步的,除非它们跨边界重新发布(例如发出 WebSocket 事件或跨越到线程中)。 |