返回列表 回复 发帖

Spring中事件处理技巧

Spring中事件处理技巧



热 点:  

 Spring中提供一些Aware相关的接口,BeanFactoryAware、 ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等,其中最常用到的是ApplicationContextAware。实现ApplicationContextAware的Bean,在Bean被初始后,将会被注入 ApplicationContext的实例。ApplicationContextAware提供了publishEvent()方法,实现Observer(观察者)设计模式的事件传播机,提供了针对Bean的事件传播功能。通过Application.publishEvent方法,我们可以将事件通知系统内所有的ApplicationListener。  

  Spring事件处理一般过程:

  ·定义Event类,继承org.springframework.context.ApplicationEvent.

  ·编写发布事件类Publisher,实现org.springframework.context.ApplicationContextAware接口.

  ·覆盖方法setApplicationContext(ApplicationContext applicationContext)和发布方法publish(Object obj)

  ·定义时间监听类EventListener,实现ApplicationListener接口,实现方法onApplicationEvent(ApplicationEvent event).

  java 代码

import org.springframework.context.ApplicationEvent;  

/**  
* 定义事件信息  
* @author new  
*  
*/  
public class MessageEvent extends ApplicationEvent {  

 private String message;  

 public void setMessage(String message){  
  this.message = message;  
 }  

 public String getMessage(){  
  return message;  
 }  

 public MessageEvent(Object source, String message) {  
  super(source);  
  this.message = message;  
  // TODO Auto-generated constructor stub  
 }  

 private static final long serialVersionUID = 1L;  
}   

  java 代码

import org.springframework.beans.BeansException;  
import org.springframework.context.ApplicationContext;  
import org.springframework.context.ApplicationContextAware;  
import org.springframework.context.support.FileSystemXmlApplicationContext;  

public class Publisher implements ApplicationContextAware {  

 private ApplicationContext context;  

 @Override  
 public void setApplicationContext(ApplicationContext arg0)  
 throws BeansException {  
  // TODO Auto-generated method stub  
  this.context = arg0;  
 }  

 public void publish(String message){  
  context.publishEvent(new MessageEvent(this,message));  
 }  

 public static void main(String[] args) {  
  ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");  
  Publisher pub = (Publisher) ctx.getBean("publisher");  
  pub.publish("Hello World!");  
  pub.publish("The quick brown fox jumped over the lazy dog");  
 }  
}   

  java 代码

import org.springframework.context.ApplicationEvent;  
import org.springframework.context.ApplicationListener;  

public class MessageEventListener implements ApplicationListener {  

 @Override  
 public void onApplicationEvent(ApplicationEvent event) {  
  // TODO Auto-generated method stub  
  if(event instanceof MessageEvent){  
   MessageEvent msEvent = (MessageEvent)event;  
   System.out.println("Received: " + msEvent.getMessage());  
  }  
 }  
}   

  在运行期,ApplicationContext会自动在当前的所有Bean中寻找ApplicationListener接口的实现,并将其作为事件接收对象。当Application.publishEvent方法调用时,所有的ApplicationListener接口实现都会被激发,每个ApplicationListener可根据事件的类型判断是否是自己需要处理的事件,如上面的ActionListener只处理ActionEvent事件。
JAVA处理这些东西确实蛮好,呵呵
走自己的路,做快乐的hacky!!!!
我顶你下拉  行不~不犯法吧?
返回列表