事件监听机制概述

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);
    }

}

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐