开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情
事件与事件监听属于spring中进阶部分的内容了,可能在平时开发中用的较少,但这部分的学习理解一人很有必要。
下面开始正式讲解:
0.观察者模式
说到观察者模式大家可能印象较少,而发布订阅模式却经常出现在大家眼里,其实发布订阅与观察者模式是一个东西。发布者(观察者)发布message(事件)通知给订阅者,订阅者订阅发布者发布的message。
1.spring中的观察者模式
驱动spring中的事件的核心包括事件源、事件、广播器、监听器。
- 事件源类似于前面提到发布者或观察者,是事件发布的对象。
- 事件类似于前面发布者发布的message,指事件源发布的信息或做出的动作。
- 广播器类似于通过广播将发布者发布的信息放大了,就好比一个人拿着喇叭说话,这个喇叭就充当广播器的作用。
- 监听器类似于前面提到的订阅者是接受消息(事件)的对象,监听事件的对象。
2.事件与监听器快速入门
spring中内置了ApplicationListener监听器接口,直接去实现这个接口就可以自定义监听器了。这个接口带有一个泛型,传入的是监听的事件。
事件介绍:
- ApplicationEvent
- ApplicationContextEvent它在构造时,会把 IOC 容器一起传进去,这意味着事件发生时,可以通过监听器直接取到
ApplicationContext而不需要做额外的操作 - 下面两组是基于ApplicationContextEvent扩展的
- ContextRefreshedEvent:代表容器刷新完毕,但还未启动
- ContextClosedEvent:容器即将关闭。
- ContextStartedEvent这个触发的时机是在所有单例Bean创建完成时。
- ContextStoppedEvent事件是在ContextClosedEvent触发之后才会触发。
下面这是一个自定义监听器的例子:泛型里面传的事件就是要监听的事件,监听到事件后就会执行onApplicationEvent这个方法。
@Component
public class ContextrefreshedApplicationListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
System.out.println("监听器监听到ContextRefreshedEvent事件!");
}
}
启动类:
public class QuickstartListenerApplication {
public static void main(String[] args) {
System.out.println("准备初始化IOC容器。。。");
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext("com.lyz.spring16");
System.out.println("IOC容器初始化完成。。。");
ctx.close();
System.out.println("IOC容器关闭。。。");
}
}
案例中,IOC初始化时,我们监听到了容器刷新完毕事件。然后IOC初始化完成,并关闭容器。倘若我们把ContextClosedEvent事件做一个监听,那当执行ctx.close这行代码时,就会监听到容器即将关闭这个事件。
除了上述到实现监听接口的方法,spring还引入了事件监听@EventListener这个注解,我们不需要继承实现任何接口或类,在方法上标注这个注解即可,当然方法中要传入事件参数。如;
@EventListener
public void onContextClosedEvent(ContextClosedEvent event) {
System.out.println("ContextClosedApplicationListener监听到ContextClosedEvent事件!");
}
最后提一下@Order这个注解,这个注解可以对事件进行排序,如@Order(1)。