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. ...
随机推荐
- readv writev示例程序
当 readv() 时候,需要程序自己提供space,接收数据. #include <stdio.h> #include <stdlib.h> #include <str ...
- Minimum Size Subarray Sum LT209
Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...
- 基于tomcat的solr环境搭建(Linux)
♥♥ solr是基于lucene的一个全文检索服务器,提供了一些类似webservice的API接口,用户可以通过http请求solr服务器,进行索引的建立和索引的搜索.索引建立的过程:用户提交的文 ...
- centos 6.5 搭建zookeeper集群
为什么使用Zookeeper? 大部分分布式应用需要一个主控.协调器或控制器来管理物理分布的子进程(如资源.任务分配等)目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制协调程序的反复编写浪费 ...
- mybatis学习七 typeAliases 别名
1. mybatis中内置的一些别名,例如Map,List,int 等常用类型 2.手动为某个类设置别名 在mybatis的全局配置文件中加如下代码 <typeAliases> <t ...
- kbmmw 中JSON 操作入门
现在各种系统中JSON 用的越来越多.delphi 也自身支持JSON 处理. 今天简要说一下kbmmw 内部如何使用和操作JSON. kbmmw 中json的操作是以TkbmMWJSONStream ...
- rails 部署 can't find gem bundler (>= 0.a) with executable bundle
多方寻找终得果,先感谢原作者,原作者博文 原因是本地项目bundler 和 服务器 bundler 版本不一致导致,项目是在本地建立,故Gemfile.lock最后一行BUNDLED WITH中是1. ...
- django rest framemark
一 内容回顾 1 开发者模式 普通开发方式:前后端放在一起开发 前后端分离:前后端只通过 JSON 来交流,组件化.工程化不需要依赖后端去实现 2 后端开发:为前端提供url接口,也就是API或者接口 ...
- mysql5.6优化
下面开始优化下my.conf文件(这里的优化只是在mysql本身的优化,之前安装的时候也要有优化) cat /etc/my.cnf # For advice on how to change sett ...
- php 操作redis 以及几个常用命令
redis-cli -h host -p port -a password 首次进入redis 进行绑定ip和端口号 del key 删除指定key exists key 检查指定key是否存 ...