在前面两讲中,我们学习了一下Spring扩展原理里面的BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor。在这一讲中,我们将会学习一下Spring剩余其他扩展原理里面的ApplicationListener。

你不知道的ApplicationListener
ApplicationListener的概述
ApplicationListener按照字面意思,它应该是Spring里面的应用监听器,也就是Spring为我们提供的基于事件驱动开发的功能。

接下来,我们看一下ApplicationListener的源码,如下图所示,可以看到它是一个接口。
image.png
也就是说,如果我们要写一个监听器,那么我们要写的监听器就得实现这个接口,而该接口中带的泛型就是我们要监听的事件。也就是说,我们应该要监听ApplicationEvent及其下面的子事件,因此,如果我们要发布事件,那么所发布的事件应该是ApplicationEvent的子类。

ApplicationListener的作用

它的作用主要是来监听IOC容器中发布的一些事件,只要事件发生便会来触发该监听器的回调,从而来完成事件驱动模型的开发。

ApplicationListener的用法

首先,编写一个类来实现ApplicationListener接口,例如MyApplicationListener,这实际上就是写了一个监听器。

  1. package com.meimeixia.ext;
  2. import org.springframework.context.ApplicationEvent;
  3. import org.springframework.context.ApplicationListener;
  4. import org.springframework.stereotype.Component;
  5. // 当然了,监听器这东西要工作,我们还得把它添加在容器中
  6. @Component
  7. public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {
  8. // 当容器中发布此事件以后,下面这个方法就会被触发
  9. @Override
  10. public void onApplicationEvent(ApplicationEvent event) {
  11. // TODO Auto-generated method stub
  12. System.out.println("收到事件:" + event);
  13. }
  14. }

然后,我们就要来测试一下以上监听器的功能了。试着运行IOCTest_Ext测试类中的test01方法,看能不能收到事件?

  1. package com.meimeixia.test;
  2. import org.junit.Test;
  3. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  4. import com.meimeixia.ext.ExtConfig;
  5. public class IOCTest_Ext {
  6. @Test
  7. public void test01() {
  8. AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class);
  9. // 关闭容器
  10. applicationContext.close();
  11. }
  12. }

如果运行以上test01方法,那么你将会看到Eclipse控制台打印出了如下内容。
image.png
哎,可以看到我们收到了两个事件,这两个事件分别是

  • org.springframework.context.event.ContextRefreshedEvent代表容器已经刷新完成事件
  • org.springframework.context.event.ContextClosedEvent代表容器关闭事件。

而且,从下图中可以看到,这两个事件都是ApplicationEvent下面的事件。
image.png
只不过现在暂时还没用到容器开始和容器停止这两个事件而已。其实,想必你也已经猜到了,IOC容器在刷新完成之后便会发布ContextRefreshedEvent事件,一旦容器关闭了便会发布ContextClosedEvent事件。

发布自定义事件

这时,你不禁要问了,我们可不可以自己发布事件呢?当然可以了,只不过此时我们应该遵循如下的步骤来进行开发。

  • 第一步,写一个监听器来监听某个事件。当然了,监听的这个事件必须是ApplicationEvent及其子类。同时把监听器加入到容器中,这样Spring才能知道有这样一个监听器。
  • 第二步,只要容器中有相关事件发布,那么我们就能监听到这个事件。举个例子,就拿我们上面监听的两个事件来说,你要搞清楚的一个问题是谁发布了这两个事件,猜都能猜得到,这两个事件都是由Spring发布的。
    • ContextRefreshedEvent:容器刷新完成事件。即容器刷新完成(此时,所有bean都已完全创建),便会发布该事件。
    • ContextClosedEvent:容器关闭事件。即容器关闭时,便会发布该事件。

其实,在上面我们也看到了,Spring还默认定义了一些其他事件。除此之外,我们自己也可以编写一些自定义事件。但是,问题的关键是我们能不能自己发布事件呢?答案是可以。

  • 第三步,我们自己来发布一个事件。而发布一个事件,我们需要像下面这么来做。

image.png
此时,运行以上test01方法,你将会看到Eclipse控制台打印出了如下内容。
image.png
除了能收到容器刷新完成和容器关闭这俩事件之外,还能收到我们调用applicationContext发布出去的事件。
只要把这个事件发布出去,那么我们自己编写的监听器就能监听到这个事件。

以上就是ApplicationListener应用监听器的使用。那么,ApplicationListener到底是怎么工作的呢?我们下一讲就来讲讲它内部的原理。