Издатель запускает событие без ссылки на те методы, которые на него реагируют с аннотацией @EventListener — прослушиватели регистрируются независимо, и издатель никогда не меняется при добавлении или удалении прослушивателей. В отличие от события Kafka, оно по умолчанию является синхронным и внутрипроцессным (поток публикации запускает каждого прослушивателя до возврата publishEvent()) и ограничивается одним ApplicationContext, не является межпроцессным или устойчивым, если прослушиватель явно не помечен @Async.
Пример
publicrecordOrderPlacedEvent(Long orderId, String customerId) {}
@Service@RequiredArgsConstructorpublicclassOrderService {
privatefinal ApplicationEventPublisher publisher;
publicvoidplaceOrder(Order order) {
orderRepository.save(order);
publisher.publishEvent(newOrderPlacedEvent(order.getId(), order.getCustomerId()));
}
}
@ComponentpublicclassOrderConfirmationEmailer {
@EventListenerpublicvoidonOrderPlaced(OrderPlacedEvent event) {
// send confirmation email - OrderService has no idea this listener exists
}
}
Итог
Издатель запускает событие без ссылки на те методы, которые на него реагируют с аннотацией @EventListener — прослушиватели регистрируются независимо, и издатель никогда не меняется при добавлении или удалении прослушивателей.
Как ApplicationEventPublisher реализует шаблон Observer и чем он от… · Sobeso