# spring event **Repository Path**: li-aogui/spring-event ## Basic Information - **Project Name**: spring event - **Description**: Spring Event 其实是一个观察者设计模式,Spring的事件为Bean和Bean之间的消息同步提供了支持。当一个bean处理完成一个任务之后,希望另外一个bean能做出相应的处理,我们想要让另外一个bean监听当前bean所发生的事件。Spring事件默认是同步模式,事件的发布和监听使用的是同一个线程。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-02-09 - **Last Updated**: 2025-02-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # spring-event #### 介绍 Spring Event 其实是一个观察者设计模式,Spring的事件为Bean和Bean之间的消息同步提供了支持。当一个bean处理完成一个任务之后,希望另外一个bean能做出相应的处理,我们想要让另外一个bean监听当前bean所发生的事件。Spring事件默认是同步模式,事件的发布和监听使用的是同一个线程。 #### spring的事件流程 1.自定义事件 ```java @Data public class OrderStatusEvent implements Serializable { private static final long serialVersionUID = 1L; /** * 订单 ID */ private String orderId; /** * 状态 */ private String status; } ``` 2.定义事件监听器 ```java @Slf4j @RequiredArgsConstructor @Component public class OrderServiceImpl implements IOrderService { private final OrderStatusEventHandler orderStatusEventHandler; @EventListener public void statusHandler(OrderStatusEvent orderStatusEvent) { log.info("OrderServiceImpl statusHandler 当前任务执行:{}", orderStatusEvent); } @Override public void order() { // 订单校验逻辑 // 下订单 // 订单状态监听 orderStatusEventHandler.statusHandler("2025020916141023", "success"); } } ``` 3.使用容器发布事件 ```java @Component public class OrderStatusEventHandler { public void statusHandler(String orderId, String status) { OrderStatusEvent event = new OrderStatusEvent(); event.setOrderId(orderId); event.setStatus(status); SpringUtils.context().publishEvent(event); } } ``` #### 事件监听器 1.实现ApplicationListener接口 2.使用@EventListener注解 3.使用@TransactionalEventListener注解 #### EventListener和TransactionalEventListener的区别 @EventListener:可以应用于任何方法,使得该方法成为一个事件监听器。 当一个事件被发布时,所有标记为 @EventListener 的方法都会被调用,无论当前是否存在一个活动的事务。 使用@EventListener 注解的方法可能在事务提交之前或之后被调用。 @TransactionalEventListener:该注解允许更精细地控制事件监听器在事务处理过程中的执行时机。 @TransactionalEventListener 默认在当前事务提交后才处理事件(TransactionPhase.AFTER_COMMIT), 这可以确保事件处理器只在事务成功提交后才被调用。也可以通过 phase 属性来改变事件处理的时机, 例如在事务开始前、事务提交前、事务提交后或者事务回滚 #### 异步使用 如果要开启异步,需要在启动类增加 @EnableAsync 注解,Listener 类需要开启异步的方法增加 @Async 注解 @Async的原理是通过 Spring AOP 动态代理 的方式来实现的。Spring 容器启动初始化bean时,判断类中是否使用了@Async注解, 如果使用了则为其创建切入点和切入点处理器,根据切入点创建代理,在线程调用@Async注解标注的方法时,会调用代理, 执行切入点处理器invoke方法,将方法的执行提交给线程池中的另外一个线程来处理,从而实现了异步执行。