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 Administrator11 * 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 Administrator10 * 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 parameter14 */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 eventId16 * the eventId to set17 */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 @Override28 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 Administrator10 * 11 */12 public class MailEventHandler extends FrameEventHandler {13 14 @Override15 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 Administrator13 * 14 */15 public class FrameEventListener implements ApplicationListener<FrameEvent> {16 17 private EventHandler eventHandler;18 19 @Override20 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.springframework.context.support.ClassPathXmlApplicationContext@2808b3: startup date [Fri Jan 23 14:23:17 CST 2015]; root of context hierarchy2015-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需要發送郵件給[email protected],郵件內容是:accdddount
新聞熱點
疑難解答