SpringBoot 事件监听机制
·
事件监听机制概述
Spring Boot 的事件监听机制基于观察者模式,允许应用程序在不同组件之间进行松耦合的通信。当某个事件发生时,所有注册的监听器都会收到通知并执行相应的处理逻辑。

创建自定义订单事件
import lombok.Getter;
import org.example.entity.User;
import org.springframework.context.ApplicationEvent;
/**
* 创建订单事件
*/
@Getter
public class OrderCreatedEvent extends ApplicationEvent {
/**
* 订单ID
*/
private final String orderId;
/**
* 订单创建用户
*/
private final User user;
public OrderCreatedEvent(Object source, String orderId, User user) {
super(source);
this.orderId = orderId;
this.user = user;
}
}
实现事件监听器
优惠券服务
import lombok.extern.slf4j.Slf4j;
import org.example.entity.User;
import org.example.event.OrderCreatedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
/**
* 优惠券服务
*/
@Slf4j
@Service
public class CouponService {
/**
* 监听创建订单事件
* @param orderCreatedEvent 订单创建事件
*/
@Order(2)
@EventListener
public void handleOrderCreateEvent(OrderCreatedEvent orderCreatedEvent) {
User user = orderCreatedEvent.getUser();
String orderId = orderCreatedEvent.getOrderId();
log.info("处理创建订单事件 ---> 添加优惠券");
// 添加优惠券
addCoupon(user, orderId);
}
/**
* 添加优惠券
* @param user 用户
* @param orderId 订单ID
*/
public void addCoupon(User user, String orderId) {
log.info("用户:{} 添加优惠券成功,订单ID:{}", user.getUsername(), orderId);
}
}
积分服务
import lombok.extern.slf4j.Slf4j;
import org.example.entity.User;
import org.example.event.OrderCreatedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
/**
* 积分服务
*/
@Slf4j
@Service
public class PointService {
/**
* 监听创建订单事件
* @param orderCreatedEvent 订单创建事件
*/
@Order(1)
@EventListener
public void handleOrderCreateEvent(OrderCreatedEvent orderCreatedEvent) {
User user = orderCreatedEvent.getUser();
String orderId = orderCreatedEvent.getOrderId();
log.info("处理创建订单事件 --->添加积分");
// 添加积分
addPoint(orderId, user);
}
/**
* 添加积分
* @param orderId 订单ID
* @param user 用户
*/
public void addPoint(String orderId, User user) {
log.info("用户:{} 添加积分成功,订单ID:{}", user.getUsername(), orderId);
}
}
消息通知服务
import lombok.extern.slf4j.Slf4j;
import org.example.entity.User;
import org.example.event.OrderCreatedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
/**
* 消息通知服务
*/
@Slf4j
@Service
public class SendNoticeService {
/**
* 监听创建订单事件
* @param orderCreatedEvent 订单创建事件
*/
@Order(3)
@EventListener
public void handleOrderCreateEvent(OrderCreatedEvent orderCreatedEvent) {
String orderId = orderCreatedEvent.getOrderId();
User user = orderCreatedEvent.getUser();
log.info("处理创建订单事件 ---> 发送消息通知");
// 发送消息通知
sendNotice(orderId, user.getUsername());
}
/**
* 发送消息通知
* @param orderId 订单ID
* @param username 用户名
*/
public void sendNotice(String orderId, String username) {
log.info("用户:{} 订单:{} 发送消息通知成功", username, orderId);
}
}
发布事件
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.example.entity.Order;
import org.example.entity.User;
import org.example.event.OrderCreatedEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import java.util.UUID;
/**
* 订单服务
*/
@Slf4j
@Service
public class OrderService {
@Resource
private ApplicationEventPublisher eventPublisher;
/**
* 创建订单
*/
public void createOrder() {
Order order = new Order();
order.setOrderId(UUID.randomUUID().toString().replace("-", ""));
order.setOrderName("张三的订单");
log.info("创建订单...{}", order);
User user = new User();
user.setUserId("1");
user.setUsername("张三");
// 发布订单创建事件
OrderCreatedEvent orderCreatedEvent = new OrderCreatedEvent(this, order.getOrderId(), user);
eventPublisher.publishEvent(orderCreatedEvent);
}
}
更多推荐
所有评论(0)