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 {
//该方法会在容器发生事件时自动触发
@Override
public 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处理用户请求结束后,系统会自动触发该事件。

spring-第三篇之ApplicationContext的事件机制的更多相关文章

  1. spring第三篇

    在昨天下午更新sprin第二篇中,叙述了将对象交给spring创建和管理,今天在spring第三篇中,主要写两个点一是spring的思想 二是spring中bean元素的属性配置. 1 spring思 ...

  2. Spring ApplicationContext的事件机制

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

  3. 7 -- Spring的基本用法 -- 4... 使用 Spring 容器:Spring 容器BeanFactory、ApplicationContext;ApplicationContext 的国际化支持;ApplicationContext 的事件机制;让Bean获取Spring容器;Spring容器中的Bean

    7.4 使用 Spring 容器 Spring 有两个核心接口:BeanFactory 和 ApplicationContext,其中ApplicationContext 是 BeanFactory ...

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

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

  5. 初学Java ssh之Spring 第三篇

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

  6. SSH框架之Spring第三篇

    1.1 AOP概述 1.1.1 什么是AOP? AOP : 全称是Aspect Oriented Progamming既 : 面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技 ...

  7. 【第三篇】学习 android 事件总线androidEventbus之发布事件,子线程中接收

    发送和接收消息的方式类似其他的发送和接收消息的事件总线一样,不同的点或者应该注意的地方: 1,比如在子线程构造方法里面进行实现总线的注册操作: 2,要想子线程中接收消息的功能执行,必须启动线程. 3, ...

  8. 【第三篇】学习 android 事件总线androidEventbus之list数据事件的传递,发送list数据事件到另外一个Activity

    这个和普通的事件总线的发送接收一样. package com.example.mysimpleeventbus; import java.util.ArrayList; import java.uti ...

  9. spring(三):ApplicationContext

随机推荐

  1. Ubuntu14 vsftp 的安装和虚拟用户配置

    一.介绍 FTP 是 File Transfer Protocol (文件传输协议)的缩写 ,在 Unix/Linux 系统中常用的免费 FTP 服务器软件主要是 VSFTP,vsftp的官方地址:h ...

  2. CSS固定定位实现右下角可关闭广告

    代码: <!DOCTYPE html><html lang="zh-cn"><head> <meta charset="UTF- ...

  3. 我是如何用python给Thunar写GUI插件的 (pygtk+glade)

    更新:zip乱码的问题可以通过安装patch之后的p7zip-natspec和unzip-natspec解决(archlinuxcn源),而仍使用Engrampa做前端.此文重点在pygtk... 问 ...

  4. 原生jdbc操作

    1:加入dbcp连接池依赖 <dependency> <groupId>org.apache.commons</groupId> <artifactId> ...

  5. luogu P3411 序列变换

    链接 P3411 序列变换 如果要最小化答案,那么就最大化不移动的数. 那么不移动的子序列一定是最后答案的一段连续区间,而移动的数我们是一定有办法把他们还原的. 设\(f_{i}\)表示\(i\)点的 ...

  6. [HYSBZ - 3252] 攻略

    问题描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(scene),某 ...

  7. Task1.PyTorch的基本概念

    1.什么是Pytorch,为什么选择Pytroch? PyTorch的前身便是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Pyth ...

  8. python实现Restful服务 (基于flask)(1)

    参考:https://www.jianshu.com/p/6ac1cab17929 参考:https://www.cnblogs.com/alexyuyu/p/6243362.html 参考:http ...

  9. bzoj 做起走 -- bzoj 1009 GT 考试

    现在每次做一道bzoj上的题,整个人都感觉升华了... 先是在网上各种搜题解.要么只有代码,要么有点讲解看不懂,对于从来没有耐心看完别人代码的我,只能一篇一篇的翻..然后终于在某2011级同学的某段话 ...

  10. 【HDOJ6656】Kejin Player(期望DP)

    题意:玩一个共有n级的游戏,i级出发每次可以花a[i]的代价,有p[i]的几率变成i+1级,有1-p[i]的几率变成x[i]级,x[i]<=i 多次询问,每次询问从l级升到r级的期望总代价 n, ...