Spring事件监听与发布
主要有以下部分:
事件(被监听的玩意),事件发布(把这个事件发布出去), 事件监听(用来监听事件, 并做行动)
项目中, 因为事件类型不同, 可以先定义事件的接口:
- Ievent:
public interface IEvent {
}
对于具体的事件, 可以实现IEvent接口: (ep:后端需要判断一个对象中是否需要上传一张照片)
- UploadPhotoEvent:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor(staticName = "of")
public class UploadPhotoEvent implements IEvent {
private Photo photo;
}
对于事件发布, 可以写方法封装以下:这样指定了事件类型为IEvent
ApplicationEventPublisher有两种方法可以发布事件,
通常调用publishEvent(ApplicationEvent event)
方法, 对象需要为ApplicationEvent, 但底层又调用了publishEvent(Object o)
- EventPublish
@Component
@RequiredArgsConstructor
public class EventPublisher {
private final ApplicationEventPublisher publisher;
public void publish(IEvent event) {
publisher.publishEvent(event);
}
}
事件发布需要写在需要把事件发布了的地方, 通常在代码中:
- 实际需要发布的地方:
@Service
public class SomeService() {
private static final EventPublisher eventPublisher;
public void someMethod() {
//photo
eventPublisher.publishEvent(UploadPhotoEvent.of(photo));
}
}
事件监听: 也可以写一个接口, 用于规范事件监听的实用:
- IEventListener 接口中只写监听到这个事件之后的函数名, 对于项目来说, 可以先配置一个异步的线程池, 用于异步的执行监听到的事件。
public interface IEventListener<E extends IEvent> {
@Async("executor")
void onEvent(E event);
}
对于这个事件的监听:
- UploadPhotoEventListener
@Slf4j//用于打印日志
@Component
@RequiredArgsConstructor
public class UploadPhotoEventListener implements IEventListener<UploadPhotoEvent> {
@Override
@EventListener
public void onEvent(UploadPhotoEvent event) {
//具体需要执行的内容
}
}
所以, 总结来说, 一个事件发布需要4个部分内容:
事件定义:
-
IEvent: 事件接口
-
UploadPhotoEvent: 具体的事件
事件发布:
- EventPublish(核心为sping的ApplicationEventPublisher类)
程序中发布事件:
- eventPublish.publishEvent(具体事件)
事件监听:
-
IEventListener: 事件监听借口
-
UploadPhotoEventListener: 具体事件的监听, 实现IEventListener接口, with
@EventListener
注解