Spring 事件处理



  • 事件

    在所有章节中,您都已经看到Spring的核心是ApplicationContext,它管理着bean的整个生命周期。加载bean时,ApplicationContext发布某些类型的事件。例如,ContextStartedEvent当上下文启动,和ContextStoppedEvent当上下文停止发布。
    通过ApplicationEvent类和ApplicationListener接口提供ApplicationContext中的事件处理。因此,如果bean实现了ApplicationListener,则每次将ApplicationEvent发布到ApplicationContext时,都会通知该bean。
    Spring提供以下标准事件:
    事件 描述
    ContextRefreshedEvent 初始化或刷新ApplicationContext时将发布此事件。也可以使用ConfigurableApplicationContext接口上的refresh()方法来引发此事件。
    ContextStartedEvent 使用ConfigurableApplicationContext接口上的start()方法启动ApplicationContext时,将触发此事件。您可以轮询数据库,也可以在收到此事件后重新启动任何已停止的应用程序。
    ContextStoppedEvent 当使用ConfigurableApplicationContext接口上的stop()方法停止ApplicationContext时,将触发此事件。收到此事件后,您可以进行必要的资源回收。
    ContextClosedEvent 使用ConfigurableApplicationContext接口上的close()方法关闭ApplicationContext时,将触发此事件。封闭的环境已经到了生命的尽头。它不能刷新或重新启动。
    RequestHandledEvent 这是一个特定于Web的事件,告诉所有Bean HTTP请求已得到服务。
    Spring的事件处理是单线程的,因此,如果事件已触发,则直到并且除非所有接收者都收到消息,否则流程将被阻塞并且流程将不会继续。因此,如果要使用事件处理,则在设计应用程序时应格外小心。
  • 监听上下文事件

    要监听上下文事件,bean应该实现ApplicationListener接口,该接口只有一个方法onApplicationEvent()。因此,让我们编写一个示例,以查看事件如何传播以及如何根据某些事件将代码放入执行所需任务的过程。
    假设我们拥有一个运行良好的Eclipse IDE,并采取以下步骤来创建一个Spring应用程序:
    1. 创建一个名称为SpringExample的项目,并在创建的项目的src文件夹下创建一个包com.jc2182
    2. 使用“添加外部JAR”选项添加所需的Spring库,如“Spring Hello World示例”一章中所述。
    3. 在com.jc2182包下创建Java类HelloWorld,CStartEventHandler,CStopEventHandler 和 MainApp。
    4. 在src文件夹下创建Beans配置文件Beans.xml。
    5. 最后一步是创建所有Java文件和Bean配置文件的内容,然后按以下说明运行应用程序。
    以下是HelloWorld.java内容。
    package com.jc2182;
    
    public class HelloWorld {
       private String message;
    
       public void setMessage(String message){
          this.message  = message;
       }
       public void getMessage(){
          System.out.println("Your Message : " + message);
       }
    }
    
    以下是CStartEventHandler.java文件的内容
    package com.jc2182;
    
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.event.ContextStartedEvent;
    
    public class CStartEventHandler 
       implements ApplicationListener<ContextStartedEvent>{
    
       public void onApplicationEvent(ContextStartedEvent event) {
          System.out.println("ContextStartedEvent Received");
       }
    }
    
    以下是CStopEventHandler.java文件的内容
    package com.jc2182;
    
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.event.ContextStoppedEvent;
    
    public class CStopEventHandler 
       implements ApplicationListener<ContextStoppedEvent>{
    
       public void onApplicationEvent(ContextStoppedEvent event) {
          System.out.println("ContextStoppedEvent Received");
       }
    }
    
    以下是MainApp.java文件的内容
    package com.jc2182;
    
    import org.springframework.context.ConfigurableApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class MainApp {
       public static void main(String[] args) {
          ConfigurableApplicationContext context = 
             new ClassPathXmlApplicationContext("Beans.xml");
    
          // Let us raise a start event.
          context.start();
              
          HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
          obj.getMessage();
    
          // Let us raise a stop event.
          context.stop();
       }
    }
    
    以下是配置文件Beans.xml
    <?xml version = "1.0" encoding = "UTF-8"?>
    
    <beans xmlns = "http://www.springframework.org/schema/beans"
       xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation = "http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    
       <bean id = "helloWorld" class = "com.jc2182.HelloWorld">
          <property name = "message" value = "Hello World!"/>
       </bean>
    
       <bean id = "cStartEventHandler" class = "com.jc2182.CStartEventHandler"/>
       <bean id = "cStopEventHandler" class = "com.jc2182.CStopEventHandler"/>
    
    </beans>
    
    创建完所有源文件并添加所需的其他库后,让我们运行该应用程序。它将显示以下消息:
    ContextStartedEvent Received
    Your Message : Hello World!
    ContextStoppedEvent Received