Spring中ApplicationEvent和ApplicationListener封装

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

 1 package com.junge.spring.event;
 2
 3 import com.junge.spring.vo.Mail;
 4
 5 public class EventTest {
 6
 7     /**
 8      * @param args
 9      */
10     public static void main(String[] args) {
11         FrameEvent frameEvent = new FrameEvent();
12
13         Mail mail = new Mail();
14         mail.setContent("accdddount");
15         mail.setEmail("[email protected]");
16
17         frameEvent.setPrameter(mail);
18         frameEvent.setEventId("send_mail_notify");
19         frameEvent.setSync(false);
20
21         FrameEventHolder.publishEvent(frameEvent);
22     }
23
24 }

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

 1 /**
 2  *
 3  */
 4 package com.junge.spring.context;
 5
 6 import org.springframework.context.ApplicationContext;
 7 import org.springframework.context.support.ClassPathXmlApplicationContext;
 8
 9 /**
10  * @author Administrator
11  *
12  */
13 public class ContextHolder {
14
15     private static ApplicationContext context = null;
16
17     static {
18         context = new ClassPathXmlApplicationContext("event.xml");
19     }
20
21     public static ApplicationContext getApplicationContext() {
22         return context;
23     }
24 }

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

 1 /**
 2  *
 3  */
 4 package com.junge.spring.event;
 5
 6 import org.springframework.context.ApplicationEvent;
 7
 8 /**
 9  * @author Administrator
10  *
11  */
12 public class FrameEvent extends ApplicationEvent {
13
14     private static final long serialVersionUID = 1L;
15
16     /**
17      * 保持事件业务参数
18      */
19     private Object prameter;
20
21     /**
22      * 一类事件编号
23      */
24     private String eventId;
25
26     public FrameEvent() {
27         super("source");
28     }
29
30     public FrameEvent(Object source) {
31         super(source);
32     }
33
34     public Object getPrameter() {
35         return prameter;
36     }
37
38     public void setPrameter(Object prameter) {
39         this.prameter = prameter;
40     }
41
42     public String getEventId() {
43         return eventId;
44     }
45
46     public void setEventId(String eventId) {
47         this.eventId = eventId;
48     }
49
50 }

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

 1 package com.junge.spring.event.handler;
 2
 3 public interface EventHandler {
 4
 5     /**
 6      * 获取事件ID
 7      */
 8     String getEventId();
 9
10     /**
11      * 处理事件入口
12      *
13      * @param parameter
14      */
15     void handle(Object parameter);
16
17 }

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

 1 /**
 2  *
 3  */
 4 package com.junge.spring.event.handler;
 5
 6 /**
 7  * @author Administrator
 8  *
 9  */
10 public abstract class FrameEventHandler implements EventHandler {
11
12     private String eventId;
13
14     /**
15      * @param eventId
16      *            the eventId to set
17      */
18     public void setEventId(String eventId) {
19         this.eventId = eventId;
20     }
21
22     /*
23      * (non-Javadoc)
24      *
25      * @see com.junge.spring.event.listener.EventHandler#getEventId()
26      */
27     @Override
28     public String getEventId() {
29
30         return eventId;
31     }
32 }

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

 1 /**
 2  *
 3  */
 4 package com.junge.spring.event.handler;
 5
 6 import com.junge.spring.vo.Mail;
 7
 8 /**
 9  * @author Administrator
10  *
11  */
12 public class MailEventHandler extends FrameEventHandler {
13
14     @Override
15     public void handle(Object parameter) {
16         if (null != parameter) {
17             Mail mail = (Mail) parameter;
18             System.out.println("需要发送邮件给" + mail.getEmail() + ",邮件内容是:"
19                     + mail.getContent());
20         }
21
22     }
23
24 }

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

 1 /**
 2  *
 3  */
 4 package com.junge.spring.event.listener;
 5
 6 import org.springframework.context.ApplicationListener;
 7
 8 import com.junge.spring.event.FrameEvent;
 9 import com.junge.spring.event.handler.EventHandler;
10
11 /**
12  * @author Administrator
13  *
14  */
15 public class FrameEventListener implements ApplicationListener<FrameEvent> {
16
17     private EventHandler eventHandler;
18
19     @Override
20     public void onApplicationEvent(FrameEvent event) {
21
22         if (eventHandler.getEventId().equals(event.getEventId())) {
23             eventHandler.handle(event.getPrameter());
24         }
25     }
26
27     public EventHandler getEventHandler() {
28         return eventHandler;
29     }
30
31     public void setEventHandler(EventHandler eventHandler) {
32         this.eventHandler = eventHandler;
33     }
34
35 }

9.业务VO对象Mail.java

 1 /**
 2  *
 3  */
 4 package com.junge.spring.vo;
 5
 6 /**
 7  * @author Administrator
 8  *
 9  */
10 public class Mail {
11     private String email;
12
13     private String content;
14
15     public String getEmail() {
16         return email;
17     }
18
19     public void setEmail(String email) {
20         this.email = email;
21     }
22
23     public String getContent() {
24         return content;
25     }
26
27     public void setContent(String content) {
28         this.content = content;
29     }
30 }

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

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

11.测试结果

2015-1-23 14:23:17 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org[email protected]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.s[email protected]db4fa2: defining beans [mailHandler,mailListener]; root of factory hierarchy
需要发送邮件给[email protected],邮件内容是:accdddount
时间: 2024-10-12 17:57:49

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

Spring 的 ApplicationEvent and ApplicationListener

什么是ApplicationContext? 它是Spring的核心,Context我们通常解释为上下文环境,但是理解成容器会更好些. ApplicationContext则是应用的容器. Spring把Bean(object)放在容器中,需要用就通过get方法取出来. ApplicationEvent 是个抽象类,里面只有一个构造函数和一个长整型的timestamp. ApplicationListener 是一个接口,里面只有一个onApplicationEvent方法. 所以自己的类在实现

spring中应用模板模式封装ElasticsearchTemplate

1.查询? @Override public <T> FacetedPage<T> queryForPage(SearchQuery query, Class<T> clazz, SearchResultMapper mapper) { SearchResponse response = doSearch(prepareSearch(query, clazz), query); return mapper.mapResults(response, clazz, quer

Spring中的设计模式

[Spring中的设计模式] http://www.uml.org.cn/j2ee/201301074.asp [详解设计模式在Spring中的应用] [http://www.geek521.com/?p=6883] [http://blog.csdn.net/fg2006/article/details/6435410] [http://ylsun1113.iteye.com/blog/828542 ] 1.简单工厂  又叫做静态工厂方法(StaticFactory Method)模式,但不属

详解设计模式在Spring中的应用

设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. 今天,螃蟹在IT学习者网站就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了其设计的思想理念,才能在工作学习中运用到“无形”. Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范.好了,话不多说,开始今天的内容. spring中常用的设计模式达到九种,我们一一举例: 第一种:简单工厂 又叫做静态工厂方法(StaticFactory Me

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

spring中的事件驱动模型也叫作发布订阅模式,是观察者模式的一个典型的应用,关于观察者模式在之前的博文中总结过,http://www.cnblogs.com/fingerboy/p/5468994.html  这里主要讲一下Spring中的观察者模式的应用. spring事件驱动模型的结构. 首先明确几个spring提供的类的概念 1.ApplicationEvent public abstract class ApplicationEvent extends EventObject { pr

spring中一些aware接口

Spring中提供一些Aware相关接口,像是BeanFactoryAware. ApplicationContextAware.ResourceLoaderAware.ServletContextAware等等,实现这些 Aware接口的Bean在被初始之后,可以取得一些相对应的资源,例如实现BeanFactoryAware的Bean在初始后,Spring容器将会注入BeanFactory的实例,而实现ApplicationContextAware的Bean,在Bean被初始后,将会被注入 A

【好文推荐】Spring中ApplicationContext的事件机制

ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext 事件处理.如果容器中有一个ApplicationListener Bean,每当ApplicationContext发布ApplicationEvent时,ApplicationListener Bean将自动被 触发. Spring的事件框架有如下两个重要的成员: ApplicationEvent:

Spring中ApplicationContext对事件的支持

Spring中ApplicationContext对事件的支持 ApplicationContext具有发布事件的能力.这是因为该接口继承了ApplicationEventPublisher接口.Spring中与事件有关的接口和类主要包括ApplicationEvent.ApplicationListener.定义一个事件的类需要继承ApplicationEvent或者ApplicationContextEvent抽象类,该抽象类中只有一个构造函数,并 且带有一个Object类型的参数作为事件源

Spring中ApplicationContext和beanfactory区别

BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring的许多插件,如AOP功能.Web应用等.   ApplicationContext接口,它由BeanFactory接口派生而来,因而提供BeanFactory所有的功能.ApplicationContext以一种更向面向框架的方式工作以及对上下文进行分层和实现继承,ApplicationContext包还提供了以下的功