[ Spring事件发布与监听 ]

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), 因此可以使用自定义的IEvent类

  • 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注解

posted @ 2023-04-07 14:50  Roy2048  阅读(85)  评论(0编辑  收藏  举报