所有分类
  • 所有分类
  • 未分类

责任链模式Java实战–写法1:Spring的事件

简介

说明

本文用示例介绍责任链模式的写法:Spring事件。这是SpringBoot项目中最推荐的责任链写法。

优缺点

优点

  1. 链上的处理类会自动注册,无需手动注册。
  2. 可以方便地指定链上的处理类的执行顺序。

缺点

实战

本处使用一个贴近真实场景的案例:订单取消时,要依次执行如下操作:退回商品的库存数量、退回用户的金额。

在这个场景中,取消订单就是调用者,账户业务和库存业务是责任链的被调用者。

项目结构:

可以看到,上边有个listener包,它就是链上的各个处理者,调用取消订单接口时就会按顺序调用链里的一系列处理逻辑。

代码

此内容查看价格为1自学币立即购买,VIP免费

测试

访问接口

启动项目后,访问Knife4j(接口文档)的地址:http://localhost:8080/doc.html

(当然,你用postman也完全可以)

结果

库存业务开始处理订单取消。接收到的消息:CancelOrderBO(orderNo=2255)
账户业务开始处理订单取消。接收到的消息:CancelOrderBO(orderNo=2255)

注意事项

此方法要慎用!因为它有坑,详见:Spring Event-踩坑(注意事项) – 自学精灵

0

评论10

请先

  1. 上文是按顺序调用责任链,每个监听器都要执行,如果某一个监听器执行异常了,后面的监听器还执行吗,前面执行完的监听器怎么回退
    天才打熊猫 2024-03-18 0
    • 1.如果某一个监听器执行异常了,后面的监听器不会执行 2.将eventPublisher.publish所在的代码块加事务注解@Transactional即可。也可以自己捕获eventPublisher.publish的异常,然后处理。
      自学精灵 2024-03-18 0
      • 明白了,同理,观察者模式也是一样,如果不捕获异常,之后的监听器就不会执行是吧, 还有一个问题,怎么实现职责链,某个监听器执行成功后,之后的监听器不在执行
        天才打熊猫 2024-03-18 0
        • 1.是的。如果不捕获异常,之后的监听器就不会执行。 2.这种情况Spring的事件不太好处理,有个不太优雅的方案是:自定义异常类型,比如:SuccessException,外边捕获到这个异常,则表示成功。这种场景建议使用注入抽象类的方式,自定义返回值即可,外边判断返回值,如果是成功了就不再执行下边的,注入抽象类这个方案的链接:https://learn.skyofit.com/archives/1457
          自学精灵 2024-03-18 0
  2. 有个小建议,代码上的注释详细点.....只看文章确实有点看不懂啊.........
    543862544 2023-09-04 0
    • 好的,反馈已收到,请看我的分析:在看设计模式时,可以先理解下这个模式是干啥的,比如这里的责任链模式,先看一下什么是事件、什么是发布者、什么是监听者,然后结合右上角的目录,事件对应哪个类,发布者对应哪个类,监听器对应哪个类,这样就清晰了。 另一方面,看类名也能看出来,比如:StorageCancelOrderListener,这个是监听器,显然就是个监听者。 如果要加注释的话,差不多也就是翻译一下,比如:这里是发布事件、这里是发布者、这里是监听者,其实目录和类名已经包含了。 可以先用上边的方法试一下,应该就能完全看懂了,具体原理可以暂时不用管,到达一定的技术地步时可以分析源码。 如果用了上边的方法还不懂,可以再次评论,我再规划一下加一些翻译性的注释之类的。
      自学精灵 2023-09-04 0
  3. 观察者模式和责任链模式有什么区别
    珠光2023已购买 2023-08-31 0
    • 观察者模式:相当于有个人拿着喇叭喊,其他人听到后做出反应(也可以不做反应)。其他人都是独立的,相互没有关联,也没有顺序要求。 责任链模式:相当于排队做事儿,前边的人做完了后边才能做,有顺序要求,相互有关联。
      自学精灵 2023-08-31 0
  4. 这种写法和观察者模式的spring事件很相似啊!
    u545923009684 2023-08-06 0
    • 写法类似,都是利用了Spring的事件,但不是完全一样。主要是如下两点: 1.观察者模式一般不需要指定顺序,而责任链模式是必须指定顺序的。 2.观察者模式一般执行结果是没有关联的,责任链模式结果是有关联的。 实际上,学完这个设计模式系列会发现,很多代码写法都是相通的,变动一下,就是另一种设计模式。
      自学精灵 2023-08-06 0
显示验证码
没有账号?注册  忘记密码?

社交账号快速登录