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
publicclass EmailEvent extendsApplicationEvent{
  privateString address;
  privateString text;
  publicEmailEvent(Object source, String address, String text){
  super(source);
     this.address = address;
     this.text = text;
   }
  publicEmailEvent(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
publicclass EmailNotifier implementsApplicationListener{
  publicvoid onApplicationEvent(ApplicationEvent event) {
     if(event instanceofEmailEvent) {
        EmailEvent emailEvent = (EmailEvent)event;
        System.out.println("邮件地址:"+ emailEvent.getAddress());
        System.our.println("邮件内容:"+ emailEvent.getText());
     }else{
        System.our.println("容器本身事件:"+ event);
     }
   }
}

将监听器配置在Spring的容器中,代码如下:

1
<beanclass="com.abc.EmailNotifier"/>

为Spring容器注册监听器,不需要像AWT编程那样采用代码进行注册,只需要在Spring的配置文件中进行简单配置即可。当我们住唉Spring中配置了一个实现了ApplicationListener的Bean,Spring容器就会把这个Bean当成容器事件的监听器。

当系统创建Spring容器、加载Spring容器时会自动触发容器事件,容器事件监听器可以监听到这些事件。除此之外,程序也可以调用ApplicationContext的publishEvent()方法来主动触发一个容器事件,如下是一个例子:

1
2
3
4
5
6
7
8
9
publicclass SpringTest {
  publicstatic void main(String args[]){
     ApplicationContext context = newClassPathXmlApplicationContext("bean.xml");
     //创建一个ApplicationEvent对象
     EmailEvent event = newEmailEvent("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处理用户请求结束后,系统会自动触发该事件。
原文出处: chenssy
from: http://www.importnew.com/20890.html

Spring中ApplicationContext的事件机制相关推荐

  1. Spring中ApplicationContext加载机制和配置初始化

    转自:http://liuwei1578.blog.163.com/blog/static/495803642007116111923195/ Spring中ApplicationContext加载机 ...

  2. Spring中ApplicationContext加载机制

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp33 加载器目前有两种选择:ContextLoaderListener和Co ...

  3. Spring中ApplicationContext和beanfactory区别

    BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring的许多插件,如AOP ...

  4. Spring5源码解析-Spring中的异步事件

    上一篇 Spring框架中的事件和监听器并未对Spring框架中的异步事件涉及太多,所以本篇是对其一个补充. 同步事件有一个主要缺点:它们在所调用线程的本地执行(也就是将所调用线程看成主线程的话,就是 ...

  5. 基于Spring中的事务管理机制

    什么是事务? 通俗理解,事务其实就是一系列指令的集合. 为什么要使用事务管理? 我们在实际业务场景中,经常会遇到数据频繁修改读取的问题.在同一时刻,不同的业务逻辑对同一个表数据进行修改,这种冲突很可能 ...

  6. spring 中 ApplicationContext 的 refresh 方法做了什么

    refresh 方法可以说是Spring中核心的一个方法了,通过这个方法可以获取bean的定义.创建添加bean到spring容器中一个其它扩展功能.记录下相关内容. 有个问题:refresh方法为什 ...

  7. Spring中实现自定义事件

    原理: 通过扩展ApplicationEvent,创建一个事件类CustomEvent.这个类必须定义一个默认的构造函数,它应该从ApplicationEvent类中继承的构造函数. 一旦定义事件类, ...

  8. Spring中ApplicationContext的getBean()方法

    getBean一共有以下四种方法原型: (1)getBean(String name) :通过id或name去查找获取bean. 参数name表示IOC容器中已经实例化的bean的id或者name,且 ...

  9. spring boot 源码分析(七) 事件机制 之 SpringApplicationEvent

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 前面的文章我们讲解了一下spring boot配置文件加载的相关源码分析,下面我们将从源码角度讲解一下spring  ...

最新文章

  1. 【杂谈】WebService是什么?
  2. c语言可以通过malloc在栈上,C语言内部静态成员陷阱
  3. jconsole观察分析Java程序的运行,进行排错调优
  4. git :设置 object-c 的忽略文件
  5. netty reactor线程模型分析
  6. window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法
  7. 巧用 TypeScript Literal Types 模拟枚举类型
  8. 【clickhouse】配置ClickHouse分布式DDL记录自动清理
  9. 为Vista写程序,不把界面整漂亮点,你都不好意思和别人打招乎 :)
  10. 比较好的文章地址收集
  11. 2016年的第一天上班,顺便开通了博客
  12. FPS游戏通用自瞄实现
  13. 3个方面:做好竞品数据分析!
  14. 3.5 菜鸟无畏——《逆袭大学》连载
  15. PHP通过PHPMailer类库实现QQ邮箱发送方法
  16. 《Machine Learning in Action》—— 白话贝叶斯,“恰瓜群众”应该恰好瓜还是恰坏瓜
  17. 第二十七篇:稳定性之故障处理【初识故障与传播方式】
  18. ENSP实验八——单区域OSPF的基本配置
  19. linux创建文档并且打字,与 Linux 一起学习:学习打字
  20. 统计大写字母出现的次数

热门文章

  1. Linux原始套接字实现分析---转
  2. 今日头条成功的核心技术秘诀是什么?深度解密个性化资讯推荐技术 本文作者:AI研习社 2017-07-05 12:24 导语:从“内行”的角度解密个性化资讯推荐技术。 雷锋网按:本文系知名 IT 技术资
  3. 海外投行抢滩大数据 人工智能等领域趋热
  4. 年终盘点:2015年人工智能的五大关键词
  5. 亲测,手把手教你用Python抢票
  6. 评分卡实战中的几个问题
  7. Spring5源码 - 14 如何在所有Bean创建完后做扩展?
  8. APM - 零侵入监控JDBC服务
  9. 数据结构与算法笔记 —— 十大经典排序及算法的稳定性
  10. 数据结构与算法笔记(五)——队列(FIFO队列、双端队列)