Spring的ApplicationEvent的使用

Spring的ApplicationEvent的使用

    Spring 3.0中提供了很多类似*Aware的类,其中ApplicationContextAware接口可以实现我们在初始化bean的时候给bean注入ApplicationConxt(Spring上下文对象)对象。ApplicationContextAware接口提供了publishEvent方法,实现了Observe(观察者)设计模式的传播机制,实现了对bean的传播。通过ApplicationContextAware我们可以把系统中所有ApplicationEvent传播给系统中所有的ApplicationListener。因此,我们只需要构造好我们自己的ApplicationEvent和ApplicationListener,就可以在系统中实现相应的监听器。

   下面以增加学生的示例来演示如何构造Spring的监听器,StudentAddEvent是监听的事件对象,StudentAddListener是事件的监听器(负责处理接收到的监听事件),StudentAddBean负责触发StudentAddEvent事件。具体步骤如下:

1.  定义StudentAddEvent监听事件

新建StudentAddEvent类,实现抽象类

org.springframework.context.ApplicationEvent

StudentAddEvent类中需要实现自己的构造函数,具体代码如下:

[java] view plaincopy
  1. package com.trs.spring.event;  
  2.   
  3. import org.springframework.context.ApplicationEvent;  
  4.   
  5. /** 
  6.  * 增加学生的监听事件 
  7.  */  
  8. public class StudentAddEvent extends ApplicationEvent {  
  9.   
  10.     /** 
  11.      *  
  12.      */  
  13.     private static final long serialVersionUID = 20L;  
  14.   
  15.     /** 
  16.      * 学生姓名 
  17.      */  
  18.     private String m_sStudentName;  
  19.   
  20.     /** 
  21.      * @param source 
  22.      */  
  23.     public StudentAddEvent(Object source, String _sStudentName) {  
  24.         super(source);  
  25.         this.m_sStudentName = _sStudentName;  
  26.     }  
  27.   
  28.     /** 
  29.      * 获取学生姓名 
  30.      *  
  31.      * @return 
  32.      */  
  33.     public String getStudentName() {  
  34.         return m_sStudentName;  
  35.     }  
  36.   
  37. }  


 

2.  定义StudentAddListener监听器

新建StudentAddListener类,实现接口

org.springframework.context.ApplicationListener

中的onApplicationEvent方法,在该方法中只处理StudentAddEvent类型的ApplicationEvent事件,代码如下:

[java] view plaincopy
  1. package com.trs.spring.event;  
  2.   
  3. import org.springframework.context.ApplicationEvent;  
  4. import org.springframework.context.ApplicationListener;  
  5.   
  6. public class StudentAddListener implements ApplicationListener {  
  7.   
  8.     /* 
  9.      * (non-Javadoc) 
  10.      *  
  11.      * @see 
  12.      * org.springframework.context.ApplicationListener#onApplicationEvent(org 
  13.      * .springframework.context.ApplicationEvent) 
  14.      */  
  15.     public void onApplicationEvent(ApplicationEvent _event) {  
  16.         // 1.判断是否是增加学生对象的事件  
  17.         if (!(_event instanceof StudentAddEvent)) {  
  18.             return;  
  19.         }  
  20.   
  21.         // 2.是增加学生事件的对象,进行逻辑处理,比如记日志、积分等  
  22.         StudentAddEvent studentAddEvent = (StudentAddEvent) _event;  
  23.         System.out.println("增加了学生:::" + studentAddEvent.getStudentName());  
  24.     }  
  25.   
  26. }  

 

3.  定义StudentAddBean触发StudentAddEvent事件

新建StudentAddBean类,实现接口

org.springframework.context.ApplicationContextAware

中的setApplicationContext方法,在构造bean的时候注入Spring的上下文对象,以便通过Spring上下文对象的publishEvent方法来触发StudentAddEvent事件,具体代码如下:

[java] view plaincopy
  1. package com.trs.spring.event;  
  2.   
  3. import org.springframework.beans.BeansException;  
  4. import org.springframework.context.ApplicationContext;  
  5. import org.springframework.context.ApplicationContextAware;  
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  7.   
  8. public class StudentAddBean implements ApplicationContextAware {  
  9.     /** 
  10.      * 定义Spring上下文对象 
  11.      */  
  12.     private ApplicationContext m_applicationContext = null;  
  13.   
  14.     /* 
  15.      * (non-Javadoc) 
  16.      *  
  17.      * @see 
  18.      * org.springframework.context.ApplicationContextAware#setApplicationContext 
  19.      * (org.springframework.context.ApplicationContext) 
  20.      */  
  21.     public void setApplicationContext(ApplicationContext _applicationContext)  
  22.             throws BeansException {  
  23.         this.m_applicationContext = _applicationContext;  
  24.   
  25.     }  
  26.   
  27.     /** 
  28.      * 增加一个学生 
  29.      *  
  30.      * @param _sStudentName 
  31.      */  
  32.     public void addStudent(String _sStudentName) {  
  33.         // 1.构造一个增加学生的事件  
  34.         StudentAddEvent aStudentEvent = new StudentAddEvent(  
  35.                 m_applicationContext, _sStudentName);  
  36.         // 2.触发增加学生事件  
  37.         m_applicationContext.publishEvent(aStudentEvent);  
  38.     }  
  39.   
  40.     /** 
  41.      * @param args 
  42.      */  
  43.     public static void main(String[] args) {  
  44.         String[] xmlConfig = new String[] { "applicationContext.xml" };  
  45.         // 使用ApplicationContext来初始化系统  
  46.         ApplicationContext context = new ClassPathXmlApplicationContext(  
  47.                 xmlConfig);  
  48.         StudentAddBean studentBean = (StudentAddBean) context  
  49.                 .getBean("StudentAddBean");  
  50.         studentBean.addStudent("我是第一个学生");  
  51.         studentBean.addStudent("第二个学生已经添加");  
  52.   
  53.     }  
  54.   
  55. }  

 

4.  applicationContext.xml配置文件

<bean id="StudentAddBean" class="com.trs.spring.event.StudentAddBean"></bean>

<bean id="StudentAddListener" class="com.trs.spring.event.StudentAddListener"></bean>

 

5.  说明

ApplicationContext在运行期会自动检测到所有实现了ApplicationListener的bean对象,并将其作为事件接收对象。当ApplicationContext的publishEvent方法被触发时,每个实现了ApplicationListener接口的bean都会收到ApplicationEvent对象,每个ApplicationListener可根据事件类型只接收处理自己感兴趣的事件,比如上面的StudentAddListener只接收StudentAddEvent事件。

6.  执行StudentAddBean的main函数,结果如下:

增加了学生:::我是第一个学生

增加了学生:::第二个学生已经添加

 

7.  测试工程下载地址:

下载地址:http://download.csdn.net/detail/wgw335363240/4022181


来源: <http://blog.csdn.net/wgw335363240/article/details/7202320#>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌浏览器地址栏记录怎么删除 Chrome浏览器地址栏记录清除方法

相信那些经常使用谷歌Chrome浏览器的朋友都清楚&#xff0c;这款浏览器软件会在地址栏保存大量的访问记录&#xff0c;其中也包括一些不想保存下来的!那么&#xff0c;谷歌浏览器地址栏记录要怎么删除呢?不清楚具体方法的朋友&#xff0c;还不赶紧收藏学习一下。 方法步骤 在…

使用Java的BlockingQueue实现生产者-消费者

BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具。 BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类 1、ArrayBlockingQueue&#xff1a;一个由数组支持的有界阻塞队列&#xff0c;规定大小的BlockingQueue,其构造函数必须带一个int参数…

win7系统怎么查看主板信息

win7系统怎么查看主板信息?主板是一台计算机最重要的硬件设备之一&#xff0c;它不仅是所有硬件系统的核心&#xff0c;也是机箱中最大的电路板。今天小编就给大家带来了win7系统查看主板信息的方法&#xff0c;一起来看看win7系统怎么查看主板信息的吧。 win7系统怎么查看主…

Mybatis判断int类型是否为空

症状 : 域名筛选在选择正式,测试的时候没问题,选择终止的时候筛选结果不对分析:正式:1测试:2终止:0不选:null选择终止的时候得到了和不选一样的结果,下图为sql判断语句,以前一直都是这么判断的没有出现过问题 错误所在:通过观察log打印的sql语句发现status0时上述条件是不成立的…

win7电脑蓝屏的解决方法

在我们使用电脑的过程中想必有很多人都会遇到蓝屏现象吧&#xff0c;蓝屏指的是操作系统在无法从一个系统错误中恢复过来时所显示的屏幕图像&#xff0c;导致蓝屏现象的原因有很多&#xff0c;今天我们来看看win7电脑蓝屏的解决方法吧。 win7电脑蓝屏的解决方法 1、今天带来的…

$.extend()和(function($){….})(jQuery)

1. JS中substring与substr的区别 之前在项目中用到substring方法&#xff0c;因为C#中也有字符串的截取方法Substring方法&#xff0c;当时也没有多想就误以为这两种方法的使用时一样的。这样就直接按照在C#中使用Substring的方式&#xff0c;直接在js中用了substring&#…

积米浏览器如何清除浏览数据

相信大家都知道&#xff0c;大多数浏览器都会自动缓存浏览数据&#xff0c;而缓存的数据多了也就会直接影响到网页的浏览速度&#xff0c;所以最好是能够经常或者定期去清除浏览数据。那么&#xff0c;如何清除浏览数据呢?下面&#xff0c;以积米浏览器为例&#xff0c;我们一…

Java文件保存与删除工具类

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream;/*** * author ahomeeye* * 2012-7-26 下午3:50:50 文件操作工具类*/ public class FileUtil {// 保存文件public static void saveFile(String newsRootPath, String filename…

win7在网上邻居上看不到别的电脑如何解决

近期在网上看到很多用户询问说win7纯净版系统在网上邻居上看不到别的电脑是什么情况呢?一般情况下&#xff0c;我们可以通过网上邻居和别的电脑共享文件、图片、视频等等。可是有时候Win7系统在网上邻居上看不到别的电脑&#xff0c;也无法搜索到。有什么办法能解决此故障问题…

循环删除List集合的错误

症状:不是郝柱也能看到灾备分析:调试发现动作中有两个灾备,不过只过滤了其中一个 错误所在:代码如下,这里for循环删除List逻辑出问题了,犯了一个比较基础的错误 : 两个灾备动作索引是相邻的,当我remove掉第一个时紧跟着的动作就会取代它原来的位置,最终导致问题发生 修改方案:解…

win10使用网络共享功能的方法

win10系统有一个网络共享功能&#xff0c;可以实现局域网之间文件和打印机的共享操作&#xff0c;从而有效提高资源共享&#xff0c;实现更高效的办公需求。好多新手用户不知道网络共享功能怎么使用?为此&#xff0c;本文教程来和大家详细说明一些使用方法。 具体方法如下: …

JSON转List

JSON转List在平时的开发中经常遇到&#xff0c;这里介绍两张方法&#xff1a; 1.使用jackson&#xff08;推荐&#xff0c;支持嵌套复杂结构&#xff09;&#xff1a; ObjectMapper mapper new ObjectMapper(); JavaType javaType mapper.getTypeFactory().constructPara…

双击ie浏览器没反应打不开的解决方法

双击ie浏览器后没反应怎么办?双击ie浏览器打不开怎么解决?ie浏览器是众多网民朋友比较熟悉的网页浏览器之一&#xff0c;但是不少用户经常会遇到双击ie浏览器没反应或者双击ie浏览器打不开的尴尬情况&#xff0c;这个问题要如何解决呢?为此小编特整理下文&#xff0c;以下解…

ajax中return取不到值的问题

症状:机器迁移时判断JS返回取不到值分析 :调试发现data是有值的&#xff0c;而且下断点调试发现这段ajax还没走完&#xff0c;后面的逻辑已经开始走了错误所在:ajax之所以叫ajax它首先是异步的&#xff0c;顺序执行的程序不需要等待ajax跑完才继续执行 修改方案:将默认为true的…

UC浏览器如何调节手机屏幕亮度

uc浏览器是一个非常好用的社交服务软件&#xff0c;用户可以使用手机随时进行线上搜索&#xff0c;这款软件使用超级的方便&#xff0c;用户在线上阅读的时候&#xff0c;有很多功能可以使用&#xff0c;在进行线上阅读的时候&#xff0c;可以对页面的文字&#xff0c;背景&…

linux的nohup命令的用法

在应用Unix/Linux时&#xff0c;我们一般想让某个程序在后台运行&#xff0c;于是我们将常会用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台&#xff1a; /usr/local/mysql/bin/mysqld_safe –usermysql &。可是有很多程序并不想mysqld一样&#xff0c;这…

谷歌浏览器如何添加信任网址 Chrome浏览器信任网址添加方法分享

和许多国产浏览器产品一样&#xff0c;谷歌旗下的Chrome浏览器中也可以将部分站点设置为信任网址&#xff0c;以便避免权限获取提示的“骚扰”。那么&#xff0c;谷歌浏览器要如何添加信任网址?不清楚具体操作的朋友&#xff0c;可以看看小编分享的Chrome浏览器信任网址添加方…

Websocket判断逻辑Bug

症状:灾备后台失败但前台提示成功分析 :下断点发现此时前端的data.obj为undifined&#xff0c;后台pyhon脚本执行报错了 错误所在:前台判断不应该加上undifined 修改方案:第一次修改如上&#xff0c;判断严谨多了&#xff0c;但是运行是前台报不能对undefined使用length分析 :…

QQ浏览器的历史记录在那 QQ浏览器查看浏览历史的方法

QQ浏览器是不少用户选择安装的一款实用性不错的浏览器&#xff0c;在使用这款浏览器的时候有不少功能注意不到&#xff0c;如QQ浏览器怎么查找历史记录等等&#xff0c;下面小编就带大家查看QQ浏览器的历史记录的步骤&#xff0c;帮助大家找回意外关闭或者未加保存到书签的网站…

SpringMVC深度探险 —— SpringMVC核心配置文件详解

在上一篇文章中&#xff0c;我们从DispatcherServlet谈起&#xff0c;最终为读者详细分析了SpringMVC的初始化主线的全部过程。整个初始化主线的研究&#xff0c;其实始终围绕着DispatcherServlet、WebApplicationContext和组件这三大元素之间的关系展开。 在文章写完之后&…