使用spring event事件通知机制做代码解耦

13 篇文章 1 订阅
4 篇文章 0 订阅

我们日常开发过程中经常会遇到一些代码逻辑不想耦合在一起,就想要解耦,这种情形下,我们可以使用spring的事件通知机制,方法如下:

创建一个通知的事件消息体:

@Data
public class BannerTransferEvent extends ApplicationEvent {
    private BannerTransfer transfer;
    public BannerTransferEvent(Object source,BannerTransfer transfer) {
        super(source);
        this.transfer = transfer;
    }
}

通知的事件消息体需继承ApplicationEvent 类。

创建一个事件的监听者,
有两种,下面是使用了注解的方式:
一:普通的事件监听者:

@Slf4j
@Component
public class BannerTransferListener {

    @EventListener
    public void handleGameChange(BannerTransferEvent event) {
       	//TODO deal event 
    }
}

二:事物的事件监听者:
事务的监听方式主要用作,我们在一些事务代码中,有一些代码逻辑想要解耦,但是由于是事物中的功能,我们要保证事物性,或者我们有时候,需要在事务真实提交之后,在触发相应的代码,都可以使用下面的事物的事件监听者。后面的phase有四种执行时机:
BEFORE_COMMIT:事务提交之前执行
AFTER_COMMIT:事务提交之后执行
AFTER_ROLLBACK:事务回滚之后执行
AFTER_COMPLETION:事务完成之后执行

public class BannerTransferListener {

    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    public void handleTransactionalBannerTransfer(BannerTransferEvent event) {
      	//TODO deal event 
    }
}

发送事件通知

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

public void doSomeThing(){
		//do some thing
		BannerTransfer transfer = new BannerTransfer();
        applicationEventPublisher.publishEvent(new BannerTransferEvent(this,transfer));
		//do some thing
}

//事物处理过程中可以发送
@Transactional(rollbackFor = Exception.class)
public void doSomeThing(){
		//do some thing
		BannerTransfer transfer = new BannerTransfer();
         applicationEventPublisher.publishEvent(new BannerTransferEvent(this,transfer));
		//do some thing
}

注意:
如果有两个监听者监听同一个通知事件,一个是事物的方式,一个是普通的方式,当在事物逻辑中发送消息时,两个事件都能接收到消息,当在普通逻辑中发送消息时,只有普通消息监听者能够收到消息。最好的方式就是不要两个监听者监听同一个通知事件,如果有业务需要这种,可以在消息体内加type区分。

另外一篇介绍spring event 的文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值