1.测试程序EventTest.java,发布一个事件只需要调用FrameEventHolder.publishEvent()方法即可。

 package com.junge.spring.event;

 import com.junge.spring.vo.Mail;

 public class EventTest {

     /**
* @param args
*/
public static void main(String[] args) {
FrameEvent frameEvent = new FrameEvent(); Mail mail = new Mail();
mail.setContent("accdddount");
mail.setEmail("333@email.com"); frameEvent.setPrameter(mail);
frameEvent.setEventId("send_mail_notify");
frameEvent.setSync(false); FrameEventHolder.publishEvent(frameEvent);
} }

2.应用上下文保持器ContextHolder.java

 /**
*
*/
package com.junge.spring.context; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* @author Administrator
*
*/
public class ContextHolder { private static ApplicationContext context = null; static {
context = new ClassPathXmlApplicationContext("event.xml");
} public static ApplicationContext getApplicationContext() {
return context;
}
}

3.事件类FrameEvent.java,继承自Spring的ApplicationEvent,可以保持事件处理参数

 /**
*
*/
package com.junge.spring.event; import org.springframework.context.ApplicationEvent; /**
* @author Administrator
*
*/
public class FrameEvent extends ApplicationEvent { private static final long serialVersionUID = 1L; /**
* 保持事件业务参数
*/
private Object prameter; /**
* 一类事件编号
*/
private String eventId; public FrameEvent() {
super("source");
} public FrameEvent(Object source) {
super(source);
} public Object getPrameter() {
return prameter;
} public void setPrameter(Object prameter) {
this.prameter = prameter;
} public String getEventId() {
return eventId;
} public void setEventId(String eventId) {
this.eventId = eventId;
} }

4.发布事件静态方法 FrameEventHolder.java

package com.junge.spring.event;

import org.springframework.util.Assert;

import com.junge.spring.context.ContextHolder;

public class FrameEventHolder {

	public static void publishEvent(FrameEvent frameEvent) {

		Assert.notNull(frameEvent);

		ContextHolder.getApplicationContext().publishEvent(frameEvent);
} }

5.事件处理接口EventHandler.java

 package com.junge.spring.event.handler;

 public interface EventHandler {

     /**
* 获取事件ID
*/
String getEventId(); /**
* 处理事件入口
*
* @param parameter
*/
void handle(Object parameter); }

6.事件处理接口抽象类FrameEventHandler.java,业务事件处理从该类继承

 /**
*
*/
package com.junge.spring.event.handler; /**
* @author Administrator
*
*/
public abstract class FrameEventHandler implements EventHandler { private String eventId; /**
* @param eventId
* the eventId to set
*/
public void setEventId(String eventId) {
this.eventId = eventId;
} /*
* (non-Javadoc)
*
* @see com.junge.spring.event.listener.EventHandler#getEventId()
*/
@Override
public String getEventId() { return eventId;
}
}

7.业务事件处理实现MailEventHandler.java,从FrameEventHandler.java继承,实现handle方法

 /**
*
*/
package com.junge.spring.event.handler; import com.junge.spring.vo.Mail; /**
* @author Administrator
*
*/
public class MailEventHandler extends FrameEventHandler { @Override
public void handle(Object parameter) {
if (null != parameter) {
Mail mail = (Mail) parameter;
System.out.println("需要发送邮件给" + mail.getEmail() + ",邮件内容是:"
+ mail.getContent());
} } }

8.事件监听器FrameEventListener.java,调用事件业务处理逻辑(即调用handle方法)

 /**
*
*/
package com.junge.spring.event.listener; import org.springframework.context.ApplicationListener; import com.junge.spring.event.FrameEvent;
import com.junge.spring.event.handler.EventHandler; /**
* @author Administrator
*
*/
public class FrameEventListener implements ApplicationListener<FrameEvent> { private EventHandler eventHandler; @Override
public void onApplicationEvent(FrameEvent event) { if (eventHandler.getEventId().equals(event.getEventId())) {
eventHandler.handle(event.getPrameter());
}
} public EventHandler getEventHandler() {
return eventHandler;
} public void setEventHandler(EventHandler eventHandler) {
this.eventHandler = eventHandler;
} }

9.业务VO对象Mail.java

 /**
*
*/
package com.junge.spring.vo; /**
* @author Administrator
*
*/
public class Mail {
private String email; private String content; public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
}
}

10.Spring业务配置文件event.xml

 <?xml version="1.0" encoding="UTF-8"?>
<p:beans xmlns:p="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans spring-beans-3.2.xsd "> <p:bean id="mailHandler" class="com.junge.spring.event.handler.MailEventHandler">
<p:property name="eventId" value="send_mail_notify" />
</p:bean> <p:bean id="mailListener" class="com.junge.spring.event.listener.FrameEventListener">
<p:property name="eventHandler" ref="mailHandler" />
</p:bean>
</p:beans>

11.测试结果

2015-1-23 14:23:17 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2808b3: startup date [Fri Jan 23 14:23:17 CST 2015]; root of context hierarchy
2015-1-23 14:23:18 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [event.xml]
2015-1-23 14:23:19 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@db4fa2: defining beans [mailHandler,mailListener]; root of factory hierarchy
需要发送邮件给333@email.com,邮件内容是:accdddount

Spring中ApplicationEvent和ApplicationListener封装的更多相关文章

  1. Spring 的 ApplicationEvent and ApplicationListener

    什么是ApplicationContext? 它是Spring的核心,Context我们通常解释为上下文环境,可是理解成容器会更好些. ApplicationContext则是应用的容器. Sprin ...

  2. Spring中ApplicationListener的使用

    背景 ApplicationListener是Spring事件机制的一部分,与抽象类ApplicationEvent类配合来完成ApplicationContext的事件机制. 如果容器中存在Appl ...

  3. 如何使用spring中的Log4jConfigListener--删除

    使用spring中的Log4jConfigListener有如如下好处:    1. 动态的改变记录级别和策略,不需要重启Web应用,如<Effective Enterprise Java> ...

  4. Spring 中的观察者模式

    一.Spring 中观察者模式的四个角色 1. 事件(ApplicationEvent) ApplicationEvent 是所有事件对象的父类.ApplicationEvent 继承自 jdk 的 ...

  5. 这篇文章,我们来谈一谈Spring中的属性注入

    本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring中的对象跟Bean,你知道Spring怎么创 ...

  6. Spring中ApplicationContext对事件的支持

    Spring中ApplicationContext对事件的支持   ApplicationContext具有发布事件的能力.这是因为该接口继承了ApplicationEventPublisher接口. ...

  7. Spring中的设计模式学习

    Spring提供了一种Template的设计哲学,包含了很多优秀的软件工程思想. 1. 简单工厂 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. ...

  8. Spring中的设计模式

    [Spring中的设计模式] http://www.uml.org.cn/j2ee/201301074.asp [详解设计模式在Spring中的应用]    [http://www.geek521.c ...

  9. spring事件驱动模型--观察者模式在spring中的应用

    spring中的事件驱动模型也叫作发布订阅模式,是观察者模式的一个典型的应用,关于观察者模式在之前的博文中总结过,http://www.cnblogs.com/fingerboy/p/5468994. ...

随机推荐

  1. Windows使用SSH Secure Shell实现免密码登录CentOS

    笔记来自:http://blog.csdn.net/jiangshouzhuang/article/details/50683049 1.在Windows上生成密钥找到Secure Shell Cli ...

  2. 用python实现数学多元数学方程式计算

    题目:公鸡5元钱一只,母鸡3元钱一只,小鸡3只一块钱,其中公鸡,母鸡,小鸡都必须有,问公鸡,母鸡,小鸡各买多少只刚好凑足100元钱? 一:数学算术分析: x+y+z=100 5x+3y+z/3=100 ...

  3. 35、输入框(UITextField)密码明暗文切换

    - (IBAction)pwdTextSwitch:(UIButton *)sender { // 前提:在xib中设置按钮的默认与选中状态的背景图 // 切换按钮的状态 sender.selecte ...

  4. javascript捕获页面窗口关闭事件

    javascript捕获窗口关闭事件有两种方法 onbeforeunload()      ,onUnload() 用法有两种: 1.    function      window.onbefore ...

  5. C++中1/0和1/0.0的区别

    参考:https://zhidao.baidu.com/question/1494117716904764979.html 问题说明:在Dev中1/0会报错“除数不得为0”,但是1/0.0不报错,并且 ...

  6. linux命令详解之useradd命令使用方法[linux下 添加用户、删除用户、修改用户密码、用户组管理]

    http://www.jb51.net/article/45848.htm Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这 ...

  7. s5-2 Cpu调度算法

    调度程序采用什么算法选择一个进程(作业)? 如何评价调度算法的性能? 调度准则 CPU利用率 – 使CPU尽可能的忙碌 吞吐量 – 单位时间内运行完的进程数 周转时间 – 进程从提交到运行结束的全部时 ...

  8. C++调用ocx

    1.保证ocx已正常注册,可以使用 2.创建一个C++的命令行程序,在主程序#import "HZ_KevinTest.ocx" no_namespace 生成一次程序,debug ...

  9. spring之jdbcTemplate

    spring的另一个功能模块data access对于数据库的支持 spring data access第一个helloword案例: 使用java程序实现访问配置 1.导包 2.测试案例 @Test ...

  10. ArrayBlockingQueue和LinkedBlockingQueue

    1.BlockingQueue接口定义了一种阻塞的FIFO queue ArrayBlockingQueue和LinkedBlockingQueue的区别: 1. 队列中锁的实现不同 ArrayBlo ...