Spring注解驱动开发第38讲——你知道ApplicationListener的用法吗?
发布日期:2021-06-30 17:56:23 浏览次数:3 分类:技术文章

本文共 2599 字,大约阅读时间需要 8 分钟。

写在前面

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

你不知道的ApplicationListener

ApplicationListener的概述

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

接下来,我们看一下ApplicationListener的源码,如下图所示,可以看到它是一个接口。

在这里插入图片描述

也就是说,如果我们要写一个监听器,那么我们要写的监听器就得实现这个接口,而该接口中带的泛型就是我们要监听的事件。也就是说,我们应该要监听ApplicationEvent及其下面的子事件,因此,如果我们要发布事件,那么所发布的事件应该是ApplicationEvent的子类。

ApplicationListener的作用

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

ApplicationListener的用法

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

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

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

package com.meimeixia.test;import org.junit.Test;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import com.meimeixia.ext.ExtConfig;public class IOCTest_Ext {
@Test public void test01() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ExtConfig.class); // 关闭容器 applicationContext.close(); }}

如果运行以上test01方法,那么你将会看到Eclipse控制台打印出了如下内容。

在这里插入图片描述

哎,可以看到我们收到了两个事件,这两个事件分别是org.springframework.context.event.ContextRefreshedEventorg.springframework.context.event.ContextClosedEvent,其中第一个是容器已经刷新完成事件,第二个是容器关闭事件。而且,从下图中可以看到,这两个事件都是ApplicationEvent下面的事件。

在这里插入图片描述

只不过现在暂时还没用到容器开始和容器停止这两个事件而已。其实,想必你也已经猜到了,IOC容器在刷新完成之后便会发布ContextRefreshedEvent事件,一旦容器关闭了便会发布ContextClosedEvent事件。

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

第一步,写一个监听器来监听某个事件。当然了,监听的这个事件必须是ApplicationEvent及其子类。

第二步,把监听器加入到容器中,这样Spring才能知道有这样一个监听器。

第三步,只要容器中有相关事件发布,那么我们就能监听到这个事件。举个例子,就拿我们上面监听的两个事件来说,你要搞清楚的一个问题是谁发布了这两个事件,猜都能猜得到,这两个事件都是由Spring发布的。

  • ContextRefreshedEvent:容器刷新完成事件。即容器刷新完成(此时,所有bean都已完全创建),便会发布该事件。
  • ContextClosedEvent:容器关闭事件。即容器关闭时,便会发布该事件。

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

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

在这里插入图片描述

此时,运行以上test01方法,你将会看到Eclipse控制台打印出了如下内容。

在这里插入图片描述

除了能收到容器刷新完成和容器关闭这俩事件之外,还能收到我们调用applicationContext发布出去的事件。只要把这个事件发布出去,那么我们自己编写的监听器就能监听到这个事件。

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

转载地址:https://liayun.blog.csdn.net/article/details/113794766 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Spring注解驱动开发第39讲——你不知道的ApplicationListener的原理
下一篇:Spring注解驱动开发第37讲——你知道Spring中BeanDefinitionRegistryPostProcessor是如何执行的吗?

发表评论

最新留言

很好
[***.229.124.182]2024年04月09日 05时27分06秒