Spring注解驱动开发第8讲——你知道ApplicationListener的用法吗?
写在前面
在前面两讲中,我们学习了一下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;
// 当然了,这东西要工作,我们还得把它添加在容器中
@Component
public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {
// 当容器中发布此事件以后,下面这个方法就会被触发
@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.ContextRefreshedEvent
和org.ContextClosedEvent
,其中第一个是容器已经刷新完成事件,第二个是容器关闭事件。而且,从下图中可以看到,这两个事件都是ApplicationEvent下面的事件。
只不过现在暂时还没用到容器开始和容器停止这两个事件而已。其实,想必你也已经猜到了,IOC容器在刷新完成之后便会发布ContextRefreshedEvent事件,一旦容器关闭了便会发布ContextClosedEvent事件。
这时,你不禁要问了,我们可不可以自己发布事件呢?当然可以了,只不过此时我们应该遵循如下的步骤来进行开发。
第一步,写一个来监听某个事件。当然了,监听的这个事件必须是ApplicationEvent及其子类。
第二步,把加入到容器中,这样Spring才能知道有这样一个。
第三步,只要容器中有相关事件发布,那么我们就能监听到这个事件。举个例子,就拿我们上面监听的两个事件来说,你要搞清楚的一个问题是谁发布了这两个事件,猜都能猜得到,这两个事件都是由Spring发布的。
- ContextRefreshedEvent:容器刷新完成事件。即容器刷新完成(此时,所有bean都已完全创建),便会发布该事件。
- ContextClosedEvent:容器关闭事件。即容器关闭时,便会发布该事件。
其实,在上面我们也看到了,Spring还默认定义了一些其他事件。除此之外,我们自己也可以编写一些自定义事件。但是,问题的关键是我们能不能自己发布事件呢?答案是可以。
第四步,我们自己来发布一个事件。而发布一个事件,我们需要像下面这么来做。
此时,运行以上test01方法,你将会看到Eclipse控制台打印出了如下内容。
除了能收到容器刷新完成和容器关闭这俩事件之外,还能收到我们调用applicationContext发布出去的事件。只要把这个事件发布出去,那么我们自己编写的就能监听到这个事件。
以上就是ApplicationListener应用的使用。那么,ApplicationListener到底是怎么工作的呢?我们下一讲就来讲讲它内部的原理。
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上一篇:IntellIJ IDEA Spring Boot项目 Error: No Spring Boot application class specified
下一篇:Java解决报错】IDEA中Spring Boot启动报错Application startup failed(记录调试rentcars项目)
推荐阅读
留言与评论(共有 14 条评论) |
本站网友 宝坻租房信息 | 5分钟前 发表 |
此时,运行以上test01方法,你将会看到Eclipse控制台打印出了如下内容 | |
本站网友 处理器是什么 | 24分钟前 发表 |
也就是说,如果我们要写一个,那么我们要写的就得实现这个接口,而该接口中带的泛型就是我们要监听的事件 | |
本站网友 上海沙宣 | 0秒前 发表 |
而发布一个事件,我们需要像下面这么来做 | |
本站网友 你喔 | 0秒前 发表 |
其实,在上面我们也看到了,Spring还默认定义了一些其他事件 | |
本站网友 如何电话订票 | 12分钟前 发表 |
除了能收到容器刷新完成和容器关闭这俩事件之外,还能收到我们调用applicationContext发布出去的事件 | |
本站网友 瓷砖团购 | 11分钟前 发表 |
试着运行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控制台打印出了如下内容 | |
本站网友 通货膨胀的原因 | 16分钟前 发表 |
ApplicationListener的作用 它的作用主要是来监听IOC容器中发布的一些事件,只要事件发生便会来触发该的回调,从而来完成事件驱动模型的开发 | |
本站网友 天职国际会计师事务所有限公司 | 16分钟前 发表 |
当然了,监听的这个事件必须是ApplicationEvent及其子类 | |
本站网友 六氢苯酐 | 30分钟前 发表 |
即容器刷新完成(此时,所有bean都已完全创建),便会发布该事件 | |
本站网友 广州美食网 | 5分钟前 发表 |
ContextRefreshedEvent:容器刷新完成事件 | |
本站网友 中草药面膜 | 19分钟前 发表 |
接下来,我们看一下ApplicationListener的源码,如下图所示,可以看到它是一个接口 | |
本站网友 整容垫鼻梁 | 25分钟前 发表 |
第四步,我们自己来发布一个事件 | |
本站网友 儿童白癜风 | 20分钟前 发表 |
ContextClosedEvent:容器关闭事件 |