在电商平台中,许多业务场景可以通过Spring的事件发布/订阅机制来实现,例如订单状态更新、库存变动、促销活动等。下面是一个简单的电商相关案例,说明了如何在Spring应用程序中使用观察者模式。
假设我们有一个电商平台,需要在用户下单后进行一系列的处理,比如发送订单确认邮件、更新库存、记录订单日志等。
import org.springframework.context.ApplicationEvent;
public class OrderEvent extends ApplicationEvent {
private String orderId;
private String userEmail;
public OrderEvent(Object source, String orderId, String userEmail) {
super(source);
this.orderId = orderId;
this.userEmail = userEmail;
}
public String getOrderId() {
return orderId;
}
public String getUserEmail() {
return userEmail;
}
}
发送订单确认邮件的监听器:
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class OrderConfirmationListener {
@EventListener
public void handleOrderEvent(OrderEvent event) {
// 发送订单确认邮件给用户
String userEmail = event.getUserEmail();
System.out.println("Sending order confirmation email to " + userEmail);
// 实际的邮件发送逻辑...
}
}
更新库存的监听器:
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class StockUpdateListener {
@EventListener
public void handleOrderEvent(OrderEvent event) {
// 更新库存信息
String orderId = event.getOrderId();
System.out.println("Updating stock for order " + orderId);
// 实际的库存更新逻辑...
}
}
记录订单日志的监听器:
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class OrderLoggingListener {
@EventListener
public void handleOrderEvent(OrderEvent event) {
// 记录订单日志
String orderId = event.getOrderId();
System.out.println("Logging order info for " + orderId);
// 实际的订单日志记录逻辑...
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
@Service
public class OrderService {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
public void createOrder(String orderId, String userEmail) {
// 创建订单逻辑...
// 订单创建后,发布一个订单事件
OrderEvent orderEvent = new OrderEvent(this, orderId, userEmail);
applicationEventPublisher.publishEvent(orderEvent);
}
}
确保所有的事件监听器和订单服务都是Spring容器管理的Bean。当OrderService的createOrder方法被调用时,它会创建一个新的订单并发布一个OrderEvent。Spring容器将自动通知所有监听OrderEvent的监听器,这些监听器将执行相应的业务逻辑,如发送确认邮件、更新库存和记录订单日志。
这样,通过Spring的事件发布/订阅机制,我们可以将业务逻辑解耦,提高代码的可维护性和可扩展性。