6 ноября 2021
Тэги: Kotlin, rest, Spring, Spring Boot, YouTube.
Spring «из коробки» предоставляет простой механизм работы с событиями, которые позволяют уменьшить связность компонентов системы. Событие, которое возникает в одной точке приложения, может быть перехвачено и обработано в любой другой части приложения благодаря таким сущностям как publisher и eventListener.
Для примера рассмотрим rest-приложение на Kotlin, в котором есть некий метод с бизнес-логикой. И мы хотим каждый вызов этого метода фиксировать. Чтобы не повышать связность кода и не делать явный вызов конкретного компонента, мы можем публиковать событие в нашей системе и любые компоненты, которые будут «прослушивать» тип такого события, смогут выполнить дополнительные действия.
Данный материал также доступен в формате видео на Youtube.
Создадим собственный тип события (data-класс), унаследовав его от стандартного класса ApplicationEvent.
У этого класса есть два поля:
Теперь нам осталось подтянуть стандартный компонент ApplicationEventPublisher в нужную нам точку приложения и опубликовать через него наше событие. Бизнесовый метод может выглядеть так:
Здесь после выполнения бизнес-логики нашего метода выполняем публикацию события, которое содержит какую-то полезную информацию.
Для краткости здесь обработка происходит в контроллере, однако в реальных проектах вся бизнес-логика должна быть инкапсулирована в сервисном слое.
Теперь создадим сервис аудита, который будет «слушать» событие. Его интерфейс может выглядеть так:
Тогда реализация примет следующий вид:
Мы можем повесить на любой метод аннотацию @EventListener и указать тип события, которое метод должен перехватывать. Разумеется, метод в качестве параметра должен принимать именно этот тип.
В нашем примере мы перехватываем событие типа BusinessEvent и просто пишем в лог его содержимое. При этом любые другие события, возникающие в системе, мы перехватывать не будем.
Spring позволяет легко реализовать простейшую событийную модель в приложении. Прежде всего это снижает связность отдельных компонентов системы между собой. В дальнейшем такая архитектура позволит легко перейти на более «серьёзные» решения вроде полноценных очередей RabbitMQ или Kafka.
Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.