一、SmartApplicationListener介绍
Spring ApplicationEvent以及对应的Listener提供了一个事件监听、发布订阅的实现,内部实现方式是观察者模式,可以解耦业务系统之间的业务,提供系统的可拓展性、复用性以及可维护性。
Spring 提供的ApplicationEvent & Listener有3种实现方式:
- @EventListener 注解的方式;
- 实现ApplicationListener接口;
- 实现SmartApplicationListener接口;
本文将要介绍SmartApplicationListener的使用方式。
SmartApplicationListener接口继承了ApplicationListener 和 Ordered接口,实现了事件监听和排序的功能。
SmartApplicationListener提供了两个方法:
/**
* 指定支持哪些类型的事件
*/
boolean supportsEventType(Class<? extends ApplicationEvent> var1);
/**
* 指定支持发生事件所在的类型
*/
boolean supportsSourceType(Class<?> var1);
二、 SmartApplicationListener代码实现
SmartApplicationListener是高级监听器,是ApplicationListener的子类,能够实现有序监听。
本文代码:https://github.com/nomico271/inspire-demo/tree/master/Ch2_SmartApplicationListener
1、SmartApplicationListener使用示例
假设订单在创建之后需要将订单创建的消息发送通知到Kafka集群做进一步处理,之前的伪代码可能为:
public void createOrder(long spuId) {
// 创建订单
long orderId = processCreateOrder(spuId);
// 订单创建成功
if (orderId > 0) {
// 发送kafka消息
sendKafkaMsg(orderId);
}
}
所有的流程都耦合在一起(当然本文只是举个例子,有些步骤是必须要耦合在一起的)。
那么使用SmartApplicationListener如何解耦这些步骤呢?
(1)首先定义事件源对象,对象中包含需要发送的基本信息。
public class OrderDTO {
private long orderId;
private String spuId;
private int orderStatus;
private Date createTime;
private Date updateTime;
}
(2)定义发生的事件:
@Getter
public class OrderStatusMsgEvent extends ApplicationEvent {
private OrderDTO orderDTO;
/**
* 重写构造函数
*
* @param source 发生事件的对象
* @param orderDTO 注册用户对象
*/
public OrderStatusMsgEvent(Object source, OrderDTO orderDTO) {
super(source);
this.orderDTO