«1. Введение
При работе с сущностью экспортер REST обрабатывает операции по созданию, сохранению и удалению событий. Мы можем использовать ApplicationListener для прослушивания этих событий и выполнения функции при выполнении определенного действия.
В качестве альтернативы мы можем использовать аннотированный обработчик, который фильтрует события по типу домена.
2. Написание аннотированного обработчика
ApplicationListener не различает типы сущностей; но с помощью аннотированного обработчика мы можем фильтровать события по типу домена.
Мы можем объявить обработчик событий на основе аннотаций, добавив аннотацию @RepositoryEventHandler к POJO. В результате это информирует BeanPostProcessor о том, что POJO необходимо проверить на наличие методов обработчика.
In the example below, we annotate the class with RepositoryEventHandler corresponding to the entity Author – and declare methods pertaining to different before and after events corresponding to the Author entity in the AuthorEventHandler class:
@RepositoryEventHandler(Author.class)
public class AuthorEventHandler {
Logger logger = Logger.getLogger("Class AuthorEventHandler");
@HandleBeforeCreate
public void handleAuthorBeforeCreate(Author author){
logger.info("Inside Author Before Create....");
String name = author.getName();
}
@HandleAfterCreate
public void handleAuthorAfterCreate(Author author){
logger.info("Inside Author After Create ....");
String name = author.getName();
}
@HandleBeforeDelete
public void handleAuthorBeforeDelete(Author author){
logger.info("Inside Author Before Delete ....");
String name = author.getName();
}
@HandleAfterDelete
public void handleAuthorAfterDelete(Author author){
logger.info("Inside Author After Delete ....");
String name = author.getName();
}
}
Здесь будут вызываться различные методы класса AuthorEventHandler в зависимости от операции, выполняемой над сущностью Author.
При обнаружении класса с аннотацией @RepositoryEventHandler Spring перебирает методы в классе, чтобы найти аннотации, соответствующие событиям до и после, упомянутым ниже: событие называется.
BeforeCreateEvent BeforeDeleteEvent BeforeSaveEvent BeforeLinkSaveEvent
-
After* Аннотации событий, связанные с аннотациями after, вызываются после вызова события.
AfterLinkSaveEvent AfterSaveEvent AfterCreateEvent AfterDeleteEvent
-
Мы также можем объявить методы с разными типами объектов, соответствующими одному и тому же типу событий в классе:
Здесь класс BookEventHandler имеет дело с более чем одним объектом. Найдя класс с аннотацией @RepositoryEventHandler, он перебирает методы и вызывает соответствующий объект перед соответствующим событием создания.
@RepositoryEventHandler
public class BookEventHandler {
@HandleBeforeCreate
public void handleBookBeforeCreate(Book book){
// code for before create book event
}
@HandleBeforeCreate
public void handleAuthorBeforeCreate(Author author){
// code for before create author event
}
}
Кроме того, нам нужно объявить обработчики событий в классе @Configuration, который будет проверять bean-компонент на наличие обработчиков и сопоставлять их с правильными событиями:
3. Заключение
@Configuration
public class RepositoryConfiguration{
public RepositoryConfiguration(){
super();
}
@Bean
AuthorEventHandler authorEventHandler() {
return new AuthorEventHandler();
}
@Bean
BookEventHandler bookEventHandler(){
return new BookEventHandler();
}
}
В заключение, это служит введение в реализацию и понимание @RepositoryEventHandler.
В этом кратком руководстве мы узнали, как реализовать аннотацию @RepositoryEventHandler для обработки различных событий, соответствующих типу объекта.
И, как всегда, полные примеры кода можно найти на Github.
«