Application Events
Spring's built-in EVENT system PUBLISHER-SUBSCRIBER pattern IMPLEMENT karta hai — ek COMPONENT ApplicationEventPublisher se EVENT PUBLISH karta hai, aur MULTIPLE, INDEPENDENT listeners (@EventListener) us event ko REACT kar sakte hain. Ye DECOUPLING achieve karta hai — publisher ko PATA NAHI hona chahiye KAUN listen kar raha hai.
Real-world example — Order place hone par, EK EVENT (OrderPlacedEvent) PUBLISH hota hai. EmailService email BHEJTA hai, InventoryService STOCK update karta hai, AnalyticsService METRICS track karta hai — TEENO INDEPENDENTLY, bina OrderService ko unke EXISTENCE ka PATA hone ke.
// Event class:
public class OrderPlacedEvent {
private final Order order;
public OrderPlacedEvent(Order order) { this.order = order; }
public Order getOrder() { return order; }
}
// Publisher:
@Service
public class OrderService {
private final ApplicationEventPublisher publisher;
public void placeOrder(Order order) {
orderRepository.save(order);
publisher.publishEvent(new OrderPlacedEvent(order)); // "fire and forget"
}
}
// Listeners — MULTIPLE, INDEPENDENT:
@Component
public class EmailNotifier {
@EventListener
public void onOrderPlaced(OrderPlacedEvent event) {
emailService.send(event.getOrder());
}
}
@Component
public class InventoryUpdater {
@EventListener
public void onOrderPlaced(OrderPlacedEvent event) {
inventoryService.reduceStock(event.getOrder());
}
}- ApplicationEventPublisher = event publish karta hai, listeners se DECOUPLED
- @EventListener = automatically matching-type events react karta hai
- Multiple listeners EK event ko INDEPENDENTLY handle kar sakte hain
ApplicationEventPublisher se, ek component EVENT PUBLISH kar sakta hai bina ye jaने ki KAUN LISTEN kar raha hai — DECOUPLING achieve hota hai. Jaise OrderPlacedEvent publish hone par, EmailService aur InventoryService dono INDEPENDENTLY react kar sakte hain, bina OrderService ko unke baare mein pata hue.
@Service
public class OrderService {
private final ApplicationEventPublisher publisher;
public void placeOrder(Order order) {
orderRepository.save(order);
publisher.publishEvent(new OrderPlacedEvent(order));
}
}@EventListener annotation se, KOI BHI bean EVENT ko LISTEN kar sakta hai — bina explicit registration ke, Spring AUTOMATICALLY method ko CALL karta hai jab MATCHING TYPE ka event publish hota hai. Multiple listeners EK EVENT ko independently handle kar sakte hain.
@Component
public class EmailNotifier {
@EventListener
public void onOrderPlaced(OrderPlacedEvent event) {
emailService.send(event.getOrder().getCustomerEmail(), "Order confirmed!");
}
}