# spring中事件监听与推送
**业务场景**:定时任务需要推送事件,监听器监听事件并对事件进行业务逻辑执行,这样使代码的关联度降低,时效性更强,spring中IOC思想就是解耦的一种体现,毕竟在一个实现类中如果调用另一个实现类不用繁琐的创建对象,只需要把需要用到实现类进行注入就可以了,减少代码量的同时也便于后期的拓展与维护。
# 1.事件监听组件
## *1.1事件源*
**可以理解为事件类型。比如说我们将的发送邮件或是发送短信都算是一种事件类型,都可以叫做事件源。**
## *1.2发布器*
**发布器也可作为事件发布者,主要作用是发布事件,一班用于逻辑完成之后进行事件发布。**
## *1.3监听器*
**主要作用就是监听是否有事件发布,如果有则执行对应的业务处理。**
## 1.4三者关系流程:
事件发布器-->事件源-->事件监听器-->监听到指定事件后执行对应的业务逻辑处理
# 2.事件发布(结和无极2.0代码分析)
## 2.1事件源
**盘点计划到达指定时间后发送id。**
**首先定义事件源,需要继承spring中事件的顶级父类,实现如下**:
```java
public class TWmsCheckPlanEvent extends ApplicationEvent {
//消息发送具体内容
@Getter
private final Integer planId;
@Getter
private final Integer warehouseId;
public TWmsCheckPlanEvent(Object source, Integer planId, Integer warehouseId) {
super(source);
this.planId = planId;
this.warehouseId = warehouseId;
}
}
```
## 2.2发布器
```java
private final ApplicationEventPublisher publisher;
```
发布推送
```java
publisher.publishEvent(new TWmsCheckPlanEvent(this, planId, warehouseId));
```
## 2.3监听器
```java
@Component
public class TWmsCheckListener implements ApplicationListener<TWmsCheckPlanEvent> {
private static final Logger LOGGER = LoggerFactory.getLogger(TWmsCheckListener.class);
// @EventListener(classes = TWmsCheckPlanEvent.class)
@Override
public void onApplicationEvent(TWmsCheckPlanEvent event) {
LOGGER.info("盘点计划plan_id:{}",event.getPlanId());
LOGGER.info("仓库warehouse_id:{}",event.getWarehouseId());
}
}
```