事件与监听器用来做什么?
从发布/订阅模式来,某个事件发布后,订阅该事件的人将自动去执行特定的操作。
例子:我关注了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更新视频啦");
}
}