Spring中ApplicationEvent和ApplicationListener封装
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封装的更多相关文章
- Spring 的 ApplicationEvent and ApplicationListener
什么是ApplicationContext? 它是Spring的核心,Context我们通常解释为上下文环境,可是理解成容器会更好些. ApplicationContext则是应用的容器. Sprin ...
- Spring中ApplicationListener的使用
背景 ApplicationListener是Spring事件机制的一部分,与抽象类ApplicationEvent类配合来完成ApplicationContext的事件机制. 如果容器中存在Appl ...
- 如何使用spring中的Log4jConfigListener--删除
使用spring中的Log4jConfigListener有如如下好处: 1. 动态的改变记录级别和策略,不需要重启Web应用,如<Effective Enterprise Java> ...
- Spring 中的观察者模式
一.Spring 中观察者模式的四个角色 1. 事件(ApplicationEvent) ApplicationEvent 是所有事件对象的父类.ApplicationEvent 继承自 jdk 的 ...
- 这篇文章,我们来谈一谈Spring中的属性注入
本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring中的对象跟Bean,你知道Spring怎么创 ...
- Spring中ApplicationContext对事件的支持
Spring中ApplicationContext对事件的支持 ApplicationContext具有发布事件的能力.这是因为该接口继承了ApplicationEventPublisher接口. ...
- Spring中的设计模式学习
Spring提供了一种Template的设计哲学,包含了很多优秀的软件工程思想. 1. 简单工厂 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一. ...
- Spring中的设计模式
[Spring中的设计模式] http://www.uml.org.cn/j2ee/201301074.asp [详解设计模式在Spring中的应用] [http://www.geek521.c ...
- spring事件驱动模型--观察者模式在spring中的应用
spring中的事件驱动模型也叫作发布订阅模式,是观察者模式的一个典型的应用,关于观察者模式在之前的博文中总结过,http://www.cnblogs.com/fingerboy/p/5468994. ...
随机推荐
- tmux 快捷操作
-- 基本使用 tmux # 运行 tmux -2 以256终端运行 C-b d # 返回主 shell , tmux 依旧在后台运行,里面的命令也保持运行状态 tmux ls # 显示已有tm ...
- Servlet会话管理二(Cookie)
Cookie是在HTTP协议下,将服务器传递给浏览器的的少量信息保存到浏览器客户端的一种技术,通过这种技术,即使在浏览器被关闭或链接中断的情况下,用户仍可以维护Cookie中的数据. Cookie是经 ...
- Data Dictionary 数据字典
数据字典是一种通用的程序设计方法.可以认为,不论什么程序,都是为了处理一定的主体,这里的主体可能是人员.商品(超子).网页.接口.数据库表.甚至需求分析等等.当主体有很多的属性,每种属性有很多的取值, ...
- [Robot Framework] 搭建Robot Framework和RIDE(Robot Framework GUI) 的环境
在windows x64的环境上进行安装,集成Selenium2和AutoIt的libraries,以下安装步骤在win 7,win 8.1,win 10, win 2012 R2上测试通过 1. 下 ...
- 2019,UI设计师必备神器
2019年将会是你全新起航的一年,相信你已经制定了很多规划,正在开启第一步的推动. 作为对UI设计师更大程度的支持,今天特意为你分享一款释放你双手的设计神器.让你可以把时间和精力投入到设计本身,这 ...
- 如何用xx-net上youtube
1.下载https://github.com/XX-net/XX-Net/blob/master/code/default/download.md 里面的稳定版本 2.下载chrome.百度chr ...
- 1.about
1)about Evarobot a.Evarobot Tech Specs 2)应用场景 Using a PC running visualisation/monitoring software a ...
- 树状数组训练题1:弱弱的战壕(vijos1066)
题目链接:弱弱的战壕 这道题似乎是vijos上能找到的最简单的树状数组题了. 原来,我有一个错误的思想,我的设计是维护两个树状数组,一个是横坐标,一个是纵坐标,然后读入每个点的坐标,扔进对应的树状数组 ...
- 9月list
开学了,我已经是大三的老学姐了,难受! 哇,时间过得好快啊,感觉自己快毕业了,肿么办!!! 9月了,快一年了,其实很多东西都变了,比如你. 9月4日的list:
- MVC 开发模式
1.M:Model 模型:实体类和业务和dao 2.V:view 视图:JSP 3.C:Controller 控制器:servlet 3.1 作用:视图和逻辑分离 4.MVC适用场景:大型项目开 ...