Spring中ApplicationContext的事件机制
ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件处理。如果容器中有一个ApplicationListener Bean,每当ApplicationContext发布ApplicationEvent时,ApplicationListener Bean将自动被触发。
Spring的事件框架有如下两个重要的成员:
- ApplicationEvent:容器事件,必须由ApplicationContext发布
- ApplicationListener:监听器,可由容器中的任何监听器Bean担任
实际上,Spring的事件机制与所有时间机制都基本相似,它们都需要事件源、事件和事件监听器组成。只是此处的事件源是ApplicationContext,且事件必须由Java程序显式触发。下面的程序将演示Spring容器的事件机制。程序先定义了一个ApplicationEvent类,其对象就是一个Spring容器事件。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class EmailEvent extends ApplicationEvent{
private String address;
private String text;
public EmailEvent(Object source, String address, String text){
super (source);
this .address = address;
this .text = text;
}
public EmailEvent(Object source) {
super (source);
}
//......address和text的setter、getter
}
|
上面的EmailEvent类继承了ApplicationEvent类,除此之外,它就是一个普通的Java类。
容器事件的监听器类必须实现ApplicationListener接口,实现该接口就必须实现如下方法:
- onApplicationEvent(ApplicationEvent event):每当容器内发生任何事件时,此方法都会被触发
本例所使用的容器监听器类代码如下:
1
2
3
4
5
6
7
8
9
10
11
|
public class EmailNotifier implements ApplicationListener{
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof EmailEvent) {
EmailEvent emailEvent = (EmailEvent)event;
System.out.println( "邮件地址:" + emailEvent.getAddress());
System.our.println( "邮件内容:" + emailEvent.getText());
} else {
System.our.println( "容器本身事件:" + event);
}
}
}
|
将监听器配置在Spring的容器中,代码如下:
1
|
<bean class = "com.abc.EmailNotifier" />
|
为Spring容器注册监听器,不需要像AWT编程那样采用代码进行注册,只需要在Spring的配置文件中进行简单配置即可。当我们住唉Spring中配置了一个实现了ApplicationListener的Bean,Spring容器就会把这个Bean当成容器事件的监听器。
当系统创建Spring容器、加载Spring容器时会自动触发容器事件,容器事件监听器可以监听到这些事件。除此之外,程序也可以调用ApplicationContext的publishEvent()方法来主动触发一个容器事件,如下是一个例子:
1
2
3
4
5
6
7
8
9
|
public class SpringTest {
public static void main(String args[]){
ApplicationContext context = new ClassPathXmlApplicationContext( "bean.xml" );
//创建一个ApplicationEvent对象
EmailEvent event = new EmailEvent( "hello" , "abc@163.com" , "This is a test" );
//主动触发该事件
context.publishEvent(event);
}
}
|
注意:如果Bean想发布事件,则Bean必须获得其容器的引用。如果程序中没有直接获取容器的引用,则应该让Bean实现ApplicationContextAware或者BeanFactoryAware接口,从而可以获得容器的引用。
Spring提供如下几个内置事件:
- ContextRefreshedEvent:ApplicationContext容器初始化或刷新时触发该事件。此处的初始化是指:所有的Bean被成功装载,后处理Bean被检测并激活,所有Singleton Bean 被预实例化,ApplicationContext容器已就绪可用
- ContextStartedEvent:当使用ConfigurableApplicationContext(ApplicationContext的子接口)接口的start()方法启动ApplicationContext容器时触发该事件。容器管理声明周期的Bean实例将获得一个指定的启动信号,这在经常需要停止后重新启动的场合比较常见
- ContextClosedEvent:当使用ConfigurableApplicationContext接口的close()方法关闭ApplicationContext时触发该事件
- ContextStoppedEvent:当使用ConfigurableApplicationContext接口的stop()方法使ApplicationContext容器停止时触发该事件。此处的停止,意味着容器管理生命周期的Bean实例将获得一个指定的停止信号,被停止的Spring容器可再次调用start()方法重新启动
- RequestHandledEvent:Web相关事件,只能应用于使用DispatcherServlet的Web应用。在使用Spring作为前端的MVC控制器时,当Spring处理用户请求结束后,系统会自动触发该事件。
Spring中ApplicationContext的事件机制相关推荐
- Spring中ApplicationContext加载机制和配置初始化
转自:http://liuwei1578.blog.163.com/blog/static/495803642007116111923195/ Spring中ApplicationContext加载机 ...
- Spring中ApplicationContext加载机制
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp33 加载器目前有两种选择:ContextLoaderListener和Co ...
- Spring中ApplicationContext和beanfactory区别
BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring的许多插件,如AOP ...
- Spring5源码解析-Spring中的异步事件
上一篇 Spring框架中的事件和监听器并未对Spring框架中的异步事件涉及太多,所以本篇是对其一个补充. 同步事件有一个主要缺点:它们在所调用线程的本地执行(也就是将所调用线程看成主线程的话,就是 ...
- 基于Spring中的事务管理机制
什么是事务? 通俗理解,事务其实就是一系列指令的集合. 为什么要使用事务管理? 我们在实际业务场景中,经常会遇到数据频繁修改读取的问题.在同一时刻,不同的业务逻辑对同一个表数据进行修改,这种冲突很可能 ...
- spring 中 ApplicationContext 的 refresh 方法做了什么
refresh 方法可以说是Spring中核心的一个方法了,通过这个方法可以获取bean的定义.创建添加bean到spring容器中一个其它扩展功能.记录下相关内容. 有个问题:refresh方法为什 ...
- Spring中实现自定义事件
原理: 通过扩展ApplicationEvent,创建一个事件类CustomEvent.这个类必须定义一个默认的构造函数,它应该从ApplicationEvent类中继承的构造函数. 一旦定义事件类, ...
- Spring中ApplicationContext的getBean()方法
getBean一共有以下四种方法原型: (1)getBean(String name) :通过id或name去查找获取bean. 参数name表示IOC容器中已经实例化的bean的id或者name,且 ...
- spring boot 源码分析(七) 事件机制 之 SpringApplicationEvent
2019独角兽企业重金招聘Python工程师标准>>> 一.前言 前面的文章我们讲解了一下spring boot配置文件加载的相关源码分析,下面我们将从源码角度讲解一下spring ...
最新文章
- 【杂谈】WebService是什么?
- c语言可以通过malloc在栈上,C语言内部静态成员陷阱
- jconsole观察分析Java程序的运行,进行排错调优
- git :设置 object-c 的忽略文件
- netty reactor线程模型分析
- window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法
- 巧用 TypeScript Literal Types 模拟枚举类型
- 【clickhouse】配置ClickHouse分布式DDL记录自动清理
- 为Vista写程序,不把界面整漂亮点,你都不好意思和别人打招乎 :)
- 比较好的文章地址收集
- 2016年的第一天上班,顺便开通了博客
- FPS游戏通用自瞄实现
- 3个方面:做好竞品数据分析!
- 3.5 菜鸟无畏——《逆袭大学》连载
- PHP通过PHPMailer类库实现QQ邮箱发送方法
- 《Machine Learning in Action》—— 白话贝叶斯,“恰瓜群众”应该恰好瓜还是恰坏瓜
- 第二十七篇:稳定性之故障处理【初识故障与传播方式】
- ENSP实验八——单区域OSPF的基本配置
- linux创建文档并且打字,与 Linux 一起学习:学习打字
- 统计大写字母出现的次数
热门文章
- Linux原始套接字实现分析---转
- 今日头条成功的核心技术秘诀是什么?深度解密个性化资讯推荐技术 本文作者:AI研习社	2017-07-05 12:24 导语:从“内行”的角度解密个性化资讯推荐技术。 雷锋网按:本文系知名 IT 技术资
- 海外投行抢滩大数据 人工智能等领域趋热
- 年终盘点:2015年人工智能的五大关键词
- 亲测,手把手教你用Python抢票
- 评分卡实战中的几个问题
- Spring5源码 - 14 如何在所有Bean创建完后做扩展?
- APM - 零侵入监控JDBC服务
- 数据结构与算法笔记 —— 十大经典排序及算法的稳定性
- 数据结构与算法笔记(五)——队列(FIFO队列、双端队列)