1. 首页
  2. Spring教程

Spring教程27篇:Spring 中的事件处理

Spring 中的事件处理

你已经看到了在所有章节中 Spring 的核心是 ApplicationContext,它负责管理 beans 的完整生命周期。当加载 beans 时,ApplicationContext 发布某些类型的事件。例如,当上下文启动时,ContextStartedEvent 发布,当上下文停止时,ContextStoppedEvent 发布。

通过 ApplicationEvent 类和 ApplicationListener 接口来提供在 ApplicationContext 中处理事件。如果一个 bean 实现 ApplicationListener,那么每次 ApplicationEvent 被发布到 ApplicationContext 上,那个 bean 会被通知。

Spring 提供了以下的标准事件:

序号 Spring内置事件&描述
1 ContextRefreshedEventApplicationContext被初始化或刷新时,该事件被发布。这也可以在ConfigurableApplicationContext接口中使用refresh()方法来发生。
2 ContextStartedEvent当使用ConfigurableApplicationContext接口中的start()方法启动ApplicationContext时,该事件被发布。你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停止的应用程序。
3 ContextStoppedEvent当使用ConfigurableApplicationContext接口中的stop()方法停止ApplicationContext时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作。
4 ContextClosedEvent当使用ConfigurableApplicationContext接口中的close()方法关闭ApplicationContext时,该事件被发布。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启。
5 RequestHandledEvent这是一个web-specific事件,告诉所有beanHTTP请求已经被服务。

由于 Spring 的事件处理是单线程的,所以如果一个事件被发布,直至并且除非所有的接收者得到的该消息,该进程被阻塞并且流程将不会继续。因此,如果事件处理被使用,在设计应用程序时应注意。

监听上下文事件

为了监听上下文事件,一个 bean 应该实现只有一个方法 onApplicationEvent() 的 ApplicationListener 接口。因此,我们写一个例子来看看事件是如何传播的,以及如何可以用代码来执行基于某些事件所需的任务。

让我们在恰当的位置使用 Eclipse IDE,然后按照下面的步骤来创建一个 Spring 应用程序:

步骤 描述
1 创建一个名称为SpringExample的项目,并且在创建项目的src文件夹中创建一个包com.tutorialspoint。
2 使用AddExternalJARs选项,添加所需的Spring库,解释见SpringHelloWorldExample章节。
3 在com.tutorialspoint包中创建Java类HelloWorld、CStartEventHandler、CStopEventHandler和MainApp。
4 在src文件夹中创建Bean的配置文件Beans.xml。
5 最后一步是创建的所有Java文件和Bean配置文件的内容,并运行应用程序,解释如下所示。

这里是 HelloWorld.java 文件的内容:

  package com.tutorialspoint;
    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.tutorialspoint;
    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.tutorialspoint;
    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.tutorialspoint;

    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.tutorialspoint.HelloWorld">
          <property name="message" value="Hello World!"/>
       </bean>

       <bean id="cStartEventHandler" 
             class="com.tutorialspoint.CStartEventHandler"/>

       <bean id="cStopEventHandler" 
             class="com.tutorialspoint.CStopEventHandler"/>

    </beans>

一旦你完成了创建源和 bean 的配置文件,我们就可以运行该应用程序。如果你的应用程序一切都正常,将输出以下消息:

  ContextStartedEvent Received
    Your Message : Hello World!
    ContextStoppedEvent Received

作者:陈

来源:https://www.w3cschool.cn/wkspring/reap1icq.html


看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:Spring教程27篇:Spring 中的事件处理

    链接:https://www.javajike.com/article/1998.html

« Spring教程28篇:Spring 中的自定义事件
Spring教程26篇:Spring 基于 Java 的配置»

相关推荐

QR code