11. 事件
这里有八种不同的事件,其中剩下的出口方发送遍及所有方面的实体工作的加工,这些都是:
BeforeCreateEvent
AfterCreateEvent
BeforeSaveEvent
AfterSaveEvent
BeforeLinkSaveEvent
AfterLinkSaveEvent
BeforeDeleteEvent
AfterDeleteEvent
11.1.写一个应用程序侦听器
有一个抽象类可以子类侦听这些事件,并根据事件类型调用相应的方法。你只是重写了你感兴趣的该事件的方法。 当然,有一件事情你要注意的是,它是没有区别的,基于实体类型的,你只能自己来检查他。
publicclassBeforeSaveEventListenerextendsAbstractRepositoryEventListener{@Overridepublicvoid onBeforeSave(Object entity){... logic to handle inspecting the entity before the Repository saves it
}@Overridepublicvoid onAfterDelete(Object entity){... send a message that this entity has been deleted
}}
然而,有一件事要注意的是,它是没有区别的基础上的实体的类型。你必须自己检查。
11.2.写注释的处理程序
另一种是使用带注释的不基于域类型过滤事件的处理程序,声明一个处理程序,创建一个POJO方法和@RepositoryEventHandler
来注释它,这样可以告诉 BeanPostProcessor
这类需要检查处理方法。一旦发现一点关于它的注释就遍历无遮蔽的方法。
比如在注释POJO不同域类型处理 BeforeSaveEvent
你可以像这样来定义你的类。
@RepositoryEventHandler(1)publicclassPersonEventHandler{@HandleBeforeSavepublicvoid handlePersonSave(Person p){// … you can now deal with Person in a type-safe way}@HandleBeforeSavepublicvoid handleProfileSave(Profile p){// … you can now deal with Profile in a type-safe way}}
1 | 通过使用此处理程序是有可能来缩小适用于的类型的。 @RepositoryEventHandler(Person.class) . |
---|---|
您感兴趣的域类型是从注释方法的第一个参数的类型确定的。
注册事件处理程序,或标记一个有Springs的类有成分的刻板印象可以通过 `@Component` stereotypes so it can be picked up by `@SpringBootApplication` or `@ComponentScan`. Or declare an instance of your annotated bean in your `ApplicationContext`. Then the `BeanPostProcessor` that is created in `RepositoryRestMvcConfiguration` 或者说你在你的注释Bean的实例应用然后建立在RepositoryRestMvcConfiguration将检查Bean的处理程序和连接到正确的事件。
@ConfigurationpublicclassRepositoryConfiguration{@BeanPersonEventHandler personEventHandler(){returnnewPersonEventHandler();}}
| | Spring Data Rest事件是定制的Spring 应用事件。 Spring事件是同步的默认情况下,除非他们得到再版跨越边界(如发行一个WebSocket事件或进入一个线程)。 Spring application events. Spring events are synchronous by default, unless they get republished across a boundary (like issuing a WebSocket event or crossing into a thread). | | --- | --- |