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

  Spring事件处理一般过程: 

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

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

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

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

  java 代码 

 
Java代码    收藏代码
  1. import org.springframework.context.ApplicationEvent;   
  2.   
  3. /**  
  4. * 定义事件信息  
  5. * @author new  
  6.  
  7. */   
  8. public class MessageEvent extends ApplicationEvent {   
  9.   
  10.  private String message;   
  11.   
  12.  public void setMessage(String message){   
  13.   this.message = message;   
  14.  }   
  15.   
  16.  public String getMessage(){   
  17.   return message;   
  18.  }   
  19.   
  20.  public MessageEvent(Object source, String message) {   
  21.   super(source);   
  22.   this.message = message;   
  23.   // TODO Auto-generated constructor stub   
  24.  }   
  25.   
  26.  private static final long serialVersionUID = 1L;   
  27. }  
 


  java 代码 

 
Java代码    收藏代码
  1. import org.springframework.beans.BeansException;   
  2. import org.springframework.context.ApplicationContext;   
  3. import org.springframework.context.ApplicationContextAware;   
  4. import org.springframework.context.support.FileSystemXmlApplicationContext;  
  5.   
  6. public class Publisher implements ApplicationContextAware {   
  7.   
  8.  private ApplicationContext context;   
  9.   
  10.  @Override   
  11.  public void setApplicationContext(ApplicationContext arg0)   
  12.  throws BeansException {   
  13.   // TODO Auto-generated method stub   
  14.   this.context = arg0;   
  15.  }   
  16.   
  17.  public void publish(String message){   
  18.   context.publishEvent(new MessageEvent(this,message));   
  19.  }   
  20.   
  21.  public static void main(String[] args) {   
  22.   ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");   
  23.   Publisher pub = (Publisher) ctx.getBean("publisher");   
  24.   pub.publish("Hello World!");   
  25.   pub.publish("The quick brown fox jumped over the lazy dog");   
  26.  }   
  27. }  
 


  java 代码 

 
Java代码    收藏代码
  1. import org.springframework.context.ApplicationEvent;   
  2. import org.springframework.context.ApplicationListener;   
  3.   
  4. public class MessageEventListener implements ApplicationListener {   
  5.   
  6.  @Override   
  7.  public void onApplicationEvent(ApplicationEvent event) {   
  8.   // TODO Auto-generated method stub   
  9.   if(event instanceof MessageEvent){   
  10.    MessageEvent msEvent = (MessageEvent)event;   
  11.    System.out.println("Received: " + msEvent.getMessage());   
  12.   }   
  13.  }   
  14. }  
 


  在运行期,ApplicationContext会自动在当前de所有Bean中寻找ApplicationListener接口de实现,并将其作为事件接收对象.当Application.publishEvent方法调用时,所有deApplicationListener接口实现都会被激发,每个ApplicationListener可根据事件de类型判断匙否匙自己需要处理de事件,如上面deActionListener只处理ActionEvent事件.