发布订阅 - 进行简单解耦

2022-06-28  本文已影响0人  flyjar

ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性。事件发布者并不需要考虑谁去监听,监听具体的实现内容是什么,发布者的工作只是为了发布事件而已。

简单实用(目标是进行解耦)

1、定义个被监听的元素

/**
 * 定义个被监听的元素
 * @author jarfly
 */
@Data
@AllArgsConstructor
public class SubmitOrderEvent {
    /**
     * 完整的订单信息
     */
    private final ShopCartOrderMergerDto mergerOrder;

    private List<Order> orders;

}

2、定义监听事件

/**
 * 确认订单信息时的默认操作
 *
 * @author jarfly
 */
@Component("defaultSubmitOrderListener")
@AllArgsConstructor
public class SubmitOrderListener {

   // 上面有个全参构造方法自动就把userAddrOrderService注入进来了
   private final UserAddrOrderService userAddrOrderService;
    
    /**
     * 计算订单金额
     */
    @EventListener(SubmitOrderEvent.class)
    public void defaultSubmitOrderListener(SubmitOrderEvent event) {
           /**
         * 省略一系列业务操作
         */
           userAddrOrderService.save(userAddrOrder);
  }
}

3、发布事件

@Service
public class OrderServiceImpl  implements OrderService {
    
     //也可以使用ApplicationContext,ApplicationContext继承了ApplicationEventPublisher
    @Autowired
    private ApplicationEventPublisher eventPublisher;


    @Override
    @Transactional(rollbackFor = Exception.class)
    public void submit(String userId, ShopCartOrderMergerDto mergerOrder) {
    
        /**
         * 省略一系列业务操作
         */
        eventPublisher.publishEvent(new SubmitOrderEvent(mergerOrder, orderList));

         /**
         * 省略一系列业务操作
         */
    }
}
上一篇下一篇

猜你喜欢

热点阅读