1、通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext的事件处理。

如果容器中有一个ApplicationListener bean,当ApplicationContext发布ApplicationEvent时,ApplicationListener bean将自动被触发。

2、spring的事件框架的两个重要成员(即Event、Listener):

1》ApplicationEvent:容器事件,必须由ApplicationContext发布。

2》ApplicationListener:监听器,可由容器中的任何监听器bean担任。

事件机制中的3要素:事件源(ApplicationContext)、事件(Event)、事件监听器(Listener)。

Event事件——>ApplicationContext事件源发布事件——>触发Listener监听器——>监听器执行内部onApplicationEvent(ApplicationEvent e)方法,Event事件作为传入参数。

由上面的流程可知,只需要在容器中注册实现了ApplicationListener的bean,当ApplicationContext发布事件的时候,就会被监听器自动捕获了。

beans.xml注册事件监听器实示例:

<?xml version="1.0" encoding="UTF-8"?>
<!-- spring配置文件的根元素,使用spring-beans-4.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"><!-- 配置监听器 --><bean class="com.lfy.listener.EmailNotifier"/>
</beans>

实现ApplicationListener接口的简单EmailNotifier.java示例代码如下:

package com.lfy.listener;import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;import com.lfy.event.EmailEvent;/*** 容器事件的监听器类* @author lfy**/
public class EmailNotifier implements ApplicationListener {//该方法会在容器发生事件时自动触发
    @Overridepublic void onApplicationEvent(ApplicationEvent evt) {//只处理EmailEvent,模拟发送email通知if(evt instanceof EmailEvent) {EmailEvent emailEvent=(EmailEvent)evt;System.out.println("需要发送邮件的接收地址 "+emailEvent.getAddress());System.out.println("需要发送邮件的邮件正文 "+emailEvent.getText());}else {//其他事件不做任何处理System.out.println("其他事件:"+evt);}}
}

继承ApplicationEvent的简单事件java bean举例EmailEvent.java

package com.lfy.event;import org.springframework.context.ApplicationEvent;/*** ApplicationContext的事件机制* 只要一个java类继承了ApplicationEvent基类,则该类的对象* 就可以作为spring容器的容器事件* @author lfy* */
public class EmailEvent extends ApplicationEvent {private String address;private String text;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getText() {return text;}public void setText(String text) {this.text = text;}public EmailEvent(Object source) {super(source);}//初始化全部成员变量的构造器public EmailEvent(Object source,String address,String text) {super(source);this.address=address;this.text=text;}}

简单的ApplicationContext事件源演示,用于发布事件,触发监听器执行处理:

SpringListenerTest.java

package com.lfy.main;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.lfy.event.EmailEvent;public class SpringListenerTest {public static void main(String[] args) {//创建spring容器ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");EmailEvent ele=new EmailEvent("test","spring_test@163.com","this is a test");//发布容器事件
        ctx.publishEvent(ele);}}

执行结果:

注:上面运行结果中的“其他事件”,是因为当系统创建spring容器、加载spring容器、容器销毁时会自动触发容器事件(内置事件),容器事件监听器可以监听到这些事件。ApplicationContext的publishEvent(...)用于主动触发指定Event事件的容器事件。

如果想让bean中业务过程发布指定容器事件,则应该先让bean获得ApplicationContext容器的引用,然后将指定容器事件Event交由ApplicationContext发布。spring-让bean获取所在的容器

3、spring的提供的内置事件:

1》ContextRefreshedEvent:ApplicationContext容器初始化或刷新触发该事件。此处说的初始化,是指所有的bean被成功加载,后处理的bean被检测激活,所有的singleton bean被预初始化,ApplicationContext容器已就绪可用。

 2》ContextStartdEvent:当使用ApplicationContext的子接口ConfigurableApplicationContex接口的start()方法启动ApplicationContext容器时触发该事件。容器管理生命周期的bean实例将获得一个指定的启动信号,这在经常需要停止后重新启动的场合比较常见。

3》ContextClossedEvent:当使用ConfigurableApplicationContex接口的close()方法关闭ApplicationContext容器时触发该事件。

4》ContextStoppedEvent:当使用ConfigurableApplicationContex接口的stop()方法使ApplicationContext容器停止时触发该事件 。此处的“停止”意味着,容器管理生命周期的bean实例将获得一个指定的停止信号。被停止的spring容器可以再次通过调用start()方法重新启动。

5》RequestHandledEvent:Web相关的事件,只能应用于使用DispatcherServlet的Web应用中。在使用spring作为前端的MVC控制器时,当spring处理用户请求结束后,系统会自动触发该事件。

转载于:https://www.cnblogs.com/ZeroMZ/p/11324173.html

spring-第三篇之ApplicationContext的事件机制相关推荐

  1. Spring中ApplicationContext的事件机制

    ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件 ...

  2. Spring第三篇【Core模块之对象依赖】

    tags: Spring 前言 在Spring的第二篇中主要讲解了Spring Core模块的使用IOC容器创建对象的问题,Spring Core模块主要是解决对象的创建和对象之间的依赖关系,因此本博 ...

  3. 初学Java ssh之Spring 第三篇

    在这篇中,我学习了依赖注入的两种方式:设值注入和构造注入. 在我们以前的思维中,如果调用一个类时,我们都需要将其手动实例化,当我们创建被调用的工作不需要我们完成时,这就是控制反转,当这个将被调用的实例 ...

  4. 第三篇、文本框事件监听

    文章目录 前言 一.文本框事件监听 二.代码示例 1.文本框事件监听 总结 前言 上一篇我们共同学习了对按钮事件的监听,本篇我们将共同学习对文本框的事件监听 一.文本框事件监听 本篇内容我们将实现对文 ...

  5. 【Spring第三篇】什么是Bean?

    在Spring 中,构成应用程序主干并由Spring IoC容器管理的对象称为bean.bean是一个由Spring IoC容器实例化.组装和管理的对象. 我们总结如下: 1.bean是对象,一个或者 ...

  6. SpringBoot | 第三十二章:事件的发布和监听

    前言 今天去官网查看spring boot资料时,在特性中看见了系统的事件及监听章节.想想,spring的事件应该是在3.x版本就发布的功能了,并越来越完善,其为bean和bean之间的消息通信提供了 ...

  7. Spring:Spring容器(BeanFactory和ApplicationContext)

    Spring的IoC容器是一个提供IoC支持的轻量级容器,IoC容器为管理对象之间的依赖关系提供了基础功能.Spring为我们提供了两种容器:BeanFactory和ApplicationContex ...

  8. 第五篇:Spring源码篇-ApplicationContext

    Spring源码篇-ApplicationContext   前面通过手写IoC,DI.AOP和Bean的配置.到最后ApplicationContext的门面处理,对于Spring相关的核心概念应该 ...

  9. spring IOC 之篇三:默认标签的解析

    private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {// 对import标签的处 ...

  10. 用仿ActionScript的语法来编写html5——第三篇,鼠标事件与游戏人物移动

    第三篇,鼠标事件与游戏人物移动 一,假设 假设,所有可添加鼠标事件的对象,都有一个mouseEvent方法,添加的鼠标事件同过这个mouseEvent来调用. 这样的话,添加鼠标事件,其实只需要给ca ...

最新文章

  1. Premiere Pro CC2019安装资料及安装教程
  2. php安全配置总结,php安全配置详细说明(1/2)_PHP教程
  3. 用户操作-用户添加操作代码实现
  4. QT4.8界面设计(MSVC2010X)+位姿哈希+ICP结果
  5. python增加子类的参数_python 子类向父类传递关键字参数
  6. 阿里程序员双11语录走红
  7. 【资源下载】清华姚班、普林斯顿博士、斯坦福大学助理教授马腾宇博士论文下载——2018ACM最佳博士论文提名
  8. hbuilderx版本怎么更新到新版本_2.9版本快雪迎春更新公告
  9. Linux内核RCU(Read Copy Update)锁简析-前传
  10. CSS-Box模型--理解与整理
  11. ibm服务器网络安装系统安装系统安装教程,IBM服务器系统安装步骤.doc
  12. 第二章:上下文无关文法
  13. 3套鱼塘合作引流话术模板?
  14. 【汉字】转【pīnyīn】
  15. 第四批入围企业公示——年度TOP100智能网联供应商评选
  16. 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(一)推荐系统概述...
  17. 搜索结果排列html模板,搜索结果页优化-城市模板
  18. 山大计算机学院夏令营2021,关于举办山东大学2021年暑期未来数学家夏令营的通知...
  19. 如何利用卫星遥感探测浒苔(绿藻)?
  20. 《Java语言程序设计与数据结构》编程练习答案(第四章)(二)

热门文章

  1. LINUX编译spandsp
  2. 常用功能错误不是问题,对待行为让人绝望
  3. 全网首发:为什么依赖库编译时加了-fPIC,还是提示依赖库要使用-fPIC?
  4. JAVA中,目录C:\\TEMP等效于C:\TEMP
  5. LINUX doubango编译中prefix参数无效
  6. 提示编码有问题时,VS保存选项
  7. 工作失误:没有分析进程消耗了这么多内存的原因
  8. 全网首发:gstreamer中正确使用avdec_h264插件
  9. java协程处理IO_并发编程 --进、线程池、协程、IO模型
  10. 公里与英里的换算c语言函数_这些天然气单位换算你知道吗?