发布订阅 - 进行简单解耦
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));
/**
* 省略一系列业务操作
*/
}
}