Spring事件驱动组成
Spring事件驱动由3个部分组成:
1、ApplicationEvent:表示事件本身,自定义事件需要继承该类。用来定义事件
2、ApplicationEventPublisherAware:事件发送器,需要实现该接口。主要用来发布事件.ApplicationContext 也实现了该接口,可以用于发布事件.
Spring4.2之后,ApplicationEventPublisher自动被注入到容器中,采用Autowired即可获取。
3、ApplicationListener:事件监听器接口。监听类实现ApplicationListener 里onApplicationEvent方法即可.
在spring4.2以后我们可以以更加简洁的方式来监听event的发布,监听事件我们不必再实现ApplicationListener接口了,只要在方法上添加注解@EventListener即可.
使用步骤
Spring中使用事件非常简单,只需要以下的几个步骤:
- 定义事件,继承ApplicationEvent
/** 积分事件驱动 * @Description: 积分事件驱动 * @Author: admin * @Date: 2023/9/12 16:58 */ public class OperateStockIntegralEvent extends ApplicationEvent { public OperateStockIntegralEvent(Object source) { super(source); } }
- 定义监听,要么实现ApplicationListener接口,要么在方法上添加@EventListener注解
@Component @Slf4j public class OperateEventListener { @Resource private ISendMessageService sendMessageService; @EventListener @Async(AsyncNameConstant.BASE_ASYNC_NAME_EXECUTOR) public void OperateStockIntegral(OperateStockIntegralEvent operateStockIntegralEvent) { OperateStockIntegralDTO stockIntegralDTO = (OperateStockIntegralDTO) operateStockIntegralEvent.getSource(); log.info("-----------操作积分事件驱动的逻辑------------" + JSONObject.toJSONString(stockIntegralDTO)); try { //发MQ消息赠送积分 sendMessageService.sendStockIntegralMQ(stockIntegralDTO); } catch (Exception e) { log.error("积分操作失败", e); } } }
- 发布事件,调用ApplicationContext.publishEvent()或者ApplicationEventPublisher.publishEvent();
@Service("subOrderService")
@Slf4j
public class SubOrderServiceImpl extends BaseServiceImpl<SubOrderMapper, SubOrderDomain> implements ISubOrderService {
@Resource
private ApplicationEventPublisher applicationEventPublisher;
@Override
public R<Object> buyProductGiveStockIntegral(SubOrderDomain suborder) {
OperateStockIntegralDTO stockIntegralDTO = new OperateStockIntegralDTO();
//用户id
stockIntegralDTO.setUserId(suborder.getUserId());
//订单id
stockIntegralDTO.setObjectId(relationId);
applicationEventPublisher.publishEvent(new OperateStockIntegralEvent(stockIntegralDTO));
return R.ok();
}
}
@TransactionalEventListener有一个属性为fallbackExecution,默认为false,指发布事件的方法没有事务控制时,监听器不进行监听事件,此为默认情况!fallbackExecution=true,则指发布事件的方法没有事务控制时,监听方法仍可以监听事件进行处理。