事件
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 事件或进入线程)。 |