Event-driven architecture — это когда компоненты общаются через события, не зная друг о друге напрямую.
// Событие:
public record UserRegistered(User user) {}
// Listener:
@Component
public class SendWelcomeEmail {
@EventListener
public void handle(UserRegistered event) {
mailer.send(event.user().email(), "Welcome!");
}
}
// Публикация события:
applicationContext.publishEvent(new UserRegistered(user));
Зачем
✔️ Слабая связанность — UserService не знает о SendWelcomeEmail
✔️ Легко добавить новый listener без изменения существующего кода (Open/Closed)
✔️ Можно делать асинхронные listeners — просто добавь @Async
В Spring
— ApplicationEventPublisher для публикации
— @EventListener для подписки
— @TransactionalEventListener — если нужно дождаться коммита транзакции
⚠️ Подводный камень: сложно трейсить цепочку — одно событие вызывает другое.