spring 事件机制

在Spring中已经定义的五个标准事件: 

  1)   ContextRefreshedEvent:当ApplicationContext初始化或者刷新时触发该事件。 

  2)   ContextClosedEvent:当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。 

  3)   RequestHandleEvent:在Web应用中,当一个http请求(request)结束触发该事件。 

  4)   ContestStartedEvent:Spring2.5新增的事件,当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。 

  5)   ContestStopedEvent:Spring2.5新增的事件,当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。 

  下面通过一个例子展示如何处理Spring内定的事件(例程3.8)。创建一个Java工程,添加Spring开发能力后,新建ioc.test包。在包中新建ApplicationEventListener类,实现ApplicationListener接口,在onApplicationEvent()方法中添加事件处理代码,如下: 

Java代码   收藏代码
  1. package ioc.test;  
  2.   
  3. // Import省略  
  4. public class ApplicationEventListener implements ApplicationListener {  
  5.   
  6.   public void onApplicationEvent(ApplicationEvent event) {  
  7.   
  8.     //如果是容器刷新事件  
  9.     if(event instanceof ContextClosedEvent ){  
  10.       System.out.println(event.getClass().getSimpleName()+" 事件已发生!");    
  11.     }else if(event instanceof ContextRefreshedEvent ){//如果是容器关闭事件  
  12.       System.out.println(event.getClass().getSimpleName()+" 事件已发生!");    
  13.     }else if(event instanceof ContextStartedEvent ){  
  14.       System.out.println(event.getClass().getSimpleName()+" 事件已发生!");  
  15.     }else if(event instanceof ContextStoppedEvent){  
  16.       System.out.println(event.getClass().getSimpleName()+" 事件已发生!");  
  17.     }else{  
  18.       System.out.println("有其它事件发生:"+event.getClass().getName());  
  19.     }  
  20.            
  21.   }  
  22.   
  23. }  



  在Spring配置文件中定义一个Bean,类为ApplicationEventListener,代码如下: 

1 <?xml version="1.0" encoding="UTF-8"?> 
2 <beans …………>  

4  <bean id="ApplicationEventListener" class="ioc.test.ApplicationEventListener" /> 

6 </beans> 


  添加含有主方法的TesMain类,在主方法中,调用容器的相应方法,触发Spring内定事件,代码如下: 

Java代码   收藏代码
  1. package ioc.test;  
  2. //import省略  
  3. public class TesMain {  
  4.   
  5.   public static void main(String[] args) {  
  6.      AbstractApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");  
  7.       
  8.   
  9.       //  ac.refresh();//触发ContextRefreshedEvent事件        
  10.      ac.start(); //触发ContextStartedEvent事件  
  11.      ac.stop(); //触发ContextStoppedEvent事件      
  12.      ac.close(); //关闭容器,触发ContextClosedEvent事件  
  13.   
  14.    }  
  15.  }  


  

  从例子中可以知道,要注册事件监听器,我们只需要把它配置成一个Bean即可,ApplicationContext容器会自动将其注册。 

============================================================== 

1、监听事件 
写一个class 实现 ApplicationListener 接口, 并且在spring 项目中进行配置,当spring 有事件发布时便会调用ApplicationListener 接口的void onApplicationEvent(ApplicationEvent evnet) 方法。 
2、 发布事件定义 
事件Class 要继承ApplicationEvent class 
3、事件发布 使用 ApplicationContext.publishEvent(evnet); 

当事件发布时所有的监听器ApplicationListener 都会收到事件通知, 
如果bean 要发布事件要得到当前的ApplicationContext引用,需要实现ApplicationContextAware接口 

实现BeanFactoryAware接口的class 能自动由环境中获得beanFactory接口, 
需要强制转换为ApplicationContext 

======================================================= 
定义事件 

Java代码   收藏代码
  1. public class ActionEvent extends ApplicationEvent {  
  2. public ActionEvent(Object source) {  
  3. super(source);  
  4. }  
  5. }  



发布事件 

Java代码   收藏代码
  1. public class LoginAction implements ApplicationContextAware {  
  2. private ApplicationContext applicationContext;  
  3. public void setApplicationContext(  
  4. ApplicationContext applicationContext  
  5. )  
  6. throws BeansException {  
  7. this.applicationContext = applicationContext;  
  8. }  
  9. public int login(String username,String password) {  
  10. ActionEvent event = new ActionEvent(username);  
  11. this.applicationContext.publishEvent(event);  
  12. return 0;  
  13. }  
  14. }  



事件监听 

Java代码   收藏代码
  1. public class ActionListener implements ApplicationListener {  
  2. public void onApplicationEvent(ApplicationEvent event) {  
  3. if (event instanceof ActionEvent) {  
  4. System.out.println(event.toString());  
  5. }  
  6. }  
  7. }  



配置bean 
<bean id="loginaction" class="beans.LoginAction"/> 
<bean id="listener" class="beans.ActionListener"/> 

测试 

Java代码   收藏代码
  1. ApplicationContext ctx=new  
  2. FileSystemXmlApplicationContext("bean.xml");  
  3. LoginAction action = (LoginAction)ctx.getBean("action");  
  4. action.login("Erica","mypass");  

猜你喜欢

转载自canann.iteye.com/blog/2156012