Spring基础篇:自定义事件与监听器

117 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

事件与监听器用来做什么?

发布/订阅模式来,某个事件发布后,订阅该事件的人将自动去执行特定的操作。

例子:我关注了UP主,当UP主更新视频的时候,我就会被通知到。

Spring为实现这样的操作,做了什么

Spring为了实现这样的操作,以事件驱动和监听器展现。它提供了

  • 事件:定义一个被监听的事件。
  • 广播器:可以广播事件(IOC容器本身作为了一个广播器)。
  • 监听器:可以监听事件。

在Spring中可以这样理解例子:

【监听器】关注了【监听动作】UP主,当UP主更新【事件发布】视频【事件】的时候,我【监听器】就会被通知【广播器广播】到。

通过这个例子,那么我们可以锁定学习的核心了,我们需要学习

  • 怎样定义事件
  • 怎样通过广播器去发布事件
  • 怎样写一个监听器去监听事件

以一个例子展开

我关注了UP主,当UP主更新视频的时候,我就会被通知到。

定义事件

通过继承ApplicationEvent的方式,自定义一个NewVideoEvent事件。假设这是一个视频发布的事件

public class NewVideoEvent extends ApplicationEvent {
    public NewVideoEvent(Object source) {
        super(source);
    }
}

Service层操作业务

我们在Service层中将这个事件通过广播器去发布,也就是当UP主更新视频的时候,广播事件。

  • 第一步:实现ApplicationEventPublisherAware拿到广播器。
    • 该操作会让我们重写一个setApplicationEventPublisher方法,通过set就明白我们需要对一个成员属性进行赋值,而这个成员属性就是ApplicationEventPublisher,广播器。
  • 第二步:在业务操作后,通过ApplicationEventPublisher对象,调用publishEvent,将事件发布。
@Service
public class Up implements ApplicationEventPublisherAware {
    private ApplicationEventPublisher applicationEventPublisher;

    public void publishVideo(){
        // 发布视频的操作
        System.out.println("发布视频");
        // 发布事件
        applicationEventPublisher.publishEvent(new NewVideoEvent("视频"));
    }
    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }

}

监听器监听业务层发布的事件,并操作

它有两种操作方式:注解的方式实现接口的方式

通过注解的方式

@EventListener:直接在方法上放上该直接即可,记得将它交给Spring容器管理,方法参数要放上监听的事件。

@Component
public class AnnoEventListener {
    @EventListener
    public void ListenNewVideoEvent(NewVideoEvent event){
        System.out.println("你关注的UP主更新视频啦");
    }
}

通过实现接口的方式

implements ApplicationListener<事件类型>

@Component
public class ImplEventListener implements ApplicationListener<NewVideoEvent> {
    @Override
    public void onApplicationEvent(NewVideoEvent event) {
        System.out.println("你关注的UP更新视频啦");
    }
}