简介
说明
本文用示例介绍观察者模式的写法:Spring事件。
Spring事件和传统观察者模式的概念的区别
传统观察者模式 | Spring事件 |
主题 | 事件 |
观察者 | 监听器 |
优缺点
优点
- 策略类会自动注册,无需手动注册策略类。
- 可以方便地指定观察者的执行顺序。(观察者模式一般不需要指定顺序,但可以指定当然更好啦!)
缺点
无
实战
本处使用一个贴近真实场景的案例:订单取消时,要有一系列操作,比如:账户业务需要给用户退钱、库存业务需要给商品退回数量。
在这个场景中,取消订单就是事件,账户业务和库存业务是监听器。
项目结构:
下载源码
此内容仅限VIP查看,请先登录
测试
测试类
package com.knife.designPattern.controller; import com.knife.designPattern.publisher.EventPublisher; import com.knife.designPattern.bo.CancelOrderBO; import com.knife.designPattern.event.CancelOrderEvent; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @Api(tags = "订单") @RestController @RequestMapping("order") public class OrderController { @Autowired private EventPublisher eventPublisher; @ApiOperation("取消订单") @PostMapping("cancel") public String cancel(@RequestBody CancelOrderBO cancelOrderBO) { eventPublisher.publish(new CancelOrderEvent(cancelOrderBO)); return "success"; } }
访问接口
启动项目后,访问Knife4j(接口文档)的地址:http://localhost:8080/doc.html
(当然,你用postman也完全可以)
结果
库存业务开始处理订单取消。接收到的消息:CancelOrderBO(orderNo=2255) 账户业务开始处理订单取消。接收到的消息:CancelOrderBO(orderNo=2255)
注意事项
此方法要慎用!因为它有坑,详见:Spring Event-踩坑(注意事项) – 自学精灵
请先
!