Spring中ApplicationContext的事件机制

    ApplicationContext事件机制是观察者设计模式的实现,经过ApplicationEvent类和ApplicationListener接口,能够实现ApplicationContext事件处理。若是容器中有一个ApplicationListener Bean,每当ApplicationContext发布ApplicationEvent时,ApplicationListener Bean将自动被触发。前端

    Spring的事件框架有以下两个重要的成员:java

  • ApplicationEvent:容器事件,必须由ApplicationContext发布编程

  • ApplicationListener:监听器,可由容器中的任何监听器Bean担任设计模式

    实际上,Spring的事件机制与全部时间机制都基本类似,它们都须要事件源、事件和事件监听器组成。只是此处的事件源是ApplicationContext,且事件必须由Java程序显式触发。下面的程序将演示Spring容器的事件机制。程序先定义了一个ApplicationEvent类,其对象就是一个Spring容器事件。代码以下:框架

public class EmailEvent extends ApplicationEvent{
   private String address;
   private String text;
   public EmailEvent(Object source, String address, String text){
   super(source);
      this.address = address;
      this.text = text;
   }
   public EmailEvent(Object source) {
     super(source);
   }
   //......address和text的setter、getter
}

  上面的EmailEvent类继承了ApplicationEvent类,除此以外,它就是一个普通的Java类。this

  容器事件的监听器类必须实现ApplicationListener接口,实现该接口就必须实现以下方法: spa

  • onApplicationEvent(ApplicationEvent event):每当容器内发生任何事件时,此方法都会被触发设计

  本例所使用的容器监听器类代码以下:code

public class EmailNotifier implements ApplicationListener{
   public void onApplicationEvent(ApplicationEvent event) {
     if (event instanceof EmailEvent) {
        EmailEvent emailEvent = (EmailEvent)event;
        System.out.println("邮件地址:" + emailEvent.getAddress());
        System.our.println("邮件内容:" + emailEvent.getText());
     } else {
        System.our.println("容器自己事件:" + event);
     }
   }
}

  将监听器配置在Spring的容器中,代码以下:xml

<bean class="com.abc.EmailNotifier" />

  为Spring容器注册监听器,不须要像AWT编程那样采用代码进行注册,只须要在Spring的配置文件中进行简单配置便可。当咱们住唉Spring中配置了一个实现了ApplicationListener的Bean,Spring容器就会把这个Bean当成容器事件的监听器。

  当系统建立Spring容器、加载Spring容器时会自动触发容器事件,容器事件监听器能够监听到这些事件。除此以外,程序也能够调用ApplicationContext的publishEvent()方法来主动触发一个容器事件,以下是一个例子:

public class SpringTest {
   public static void main(String args[]){
     ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
     //建立一个ApplicationEvent对象
     EmailEvent event = new EmailEvent("hello","abc@163.com","This is a test");
     //主动触发该事件
     context.publishEvent(event);
   }
}

  注意:若是Bean想发布事件,则Bean必须得到其容器的引用。若是程序中没有直接获取容器的引用,则应该让Bean实现ApplicationContextAware或者BeanFactoryAware接口,从而能够得到容器的引用。

  Spring提供以下几个内置事件:

  • ContextRefreshedEvent:ApplicationContext容器初始化或刷新时触发该事件。此处的初始化是指:全部的Bean被成功装载,后处理Bean被检测并激活,全部Singleton Bean 被预实例化,ApplicationContext容器已就绪可用

  • ContextStartedEvent:当使用ConfigurableApplicationContext(ApplicationContext的子接口)接口的start()方法启动ApplicationContext容器时触发该事件。容器管理声明周期的Bean实例将得到一个指定的启动信号,这在常常须要中止后从新启动的场合比较常见

  • ContextClosedEvent:当使用ConfigurableApplicationContext接口的close()方法关闭ApplicationContext时触发该事件

  • ContextStoppedEvent:当使用ConfigurableApplicationContext接口的stop()方法使ApplicationContext容器中止时触发该事件。此处的中止,意味着容器管理生命周期的Bean实例将得到一个指定的中止信号,被中止的Spring容器可再次调用start()方法从新启动

  • RequestHandledEvent:Web相关事件,只能应用于使用DispatcherServlet的Web应用。在使用Spring做为前端的MVC控制器时,当Spring处理用户请求结束后,系统会自动触发该事件。

相关文章
相关标签/搜索