1. Введение
При работе с сущностью экспортер REST обрабатывает операции по созданию, сохранению и удалению событий. Мы можем использовать ApplicationListener
для прослушивания этих событий и выполнения функции при выполнении определенного действия.
В качестве альтернативы мы можем использовать аннотированный обработчик, который фильтрует события по типу домена.
2. Написание аннотированного обработчика
ApplicationListener не различает типы сущностей ;
но с помощью аннотированного обработчика мы можем фильтровать события по типу домена .
Мы можем объявить обработчик событий на основе аннотаций, добавив аннотацию @RepositoryEventHandler
к POJO. В результате это информирует BeanPostProcessor
о том, что POJO необходимо проверить на наличие методов обработчика.
В приведенном ниже примере мы аннотируем класс с помощью RepositoryEventHandler
, соответствующего сущности Author
, и объявляем методы, относящиеся к различным событиям до и после, соответствующим сущности Author , в классе
AuthorEventHandler
:
@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 перебирает методы в классе, чтобы найти аннотации, соответствующие событиям до и после, упомянутым ниже:
Аннотации до*
событий — связаны с тем, что аннотации до вызываются до вызова события.
Перед созданием события
Перед Удалить Событие
Перед сохранением события
Перед LinkSaveEvent
`Аннотации событий
After*` — связанные с аннотациями after, вызываются после вызова события.
Событие AfterLinkSave
AfterSaveEvent
Афтеркреатеевент
AfterDeleteEvent
Мы также можем объявить методы с разными типами сущностей, соответствующими одному и тому же типу события в классе:
@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
}
}
Здесь класс BookEventHandler
имеет дело с несколькими объектами. Найдя класс с аннотацией @RepositoryEventHandler
, он перебирает методы и вызывает соответствующий объект перед соответствующим событием создания.
Кроме того, нам нужно объявить обработчики событий в классе @Configuration
, который будет проверять bean-компонент на наличие обработчиков и сопоставлять их с правильными событиями:
@Configuration
public class RepositoryConfiguration{
public RepositoryConfiguration(){
super();
}
@Bean
AuthorEventHandler authorEventHandler() {
return new AuthorEventHandler();
}
@Bean
BookEventHandler bookEventHandler(){
return new BookEventHandler();
}
}
3. Заключение
В заключение, это служит введением в реализацию и понимание @RepositoryEventHandler.
В этом кратком руководстве мы узнали, как реализовать аннотацию @RepositoryEventHandler
для обработки различных событий, соответствующих типу объекта.
И, как всегда, полные примеры кода можно найти на Github .