Spring中ApplicationContext的事件机制

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

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

  • ApplicationEvent:容器事件,必须由ApplicationContext发布
  • ApplicationListener:监听器,可由容器中的任何监听器Bean担任

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

?


1

2

3

4

5

6

7

8

9

10

11

12

13

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类。

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

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

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

?


1

2

3

4

5

6

7

8

9

10

11

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的容器中,代码如下:

?


1

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

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

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

?


1

2

3

4

5

6

7

8

9

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处理用户请求结束后,系统会自动触发该事件。
时间: 2024-12-03 05:01:29

Spring中ApplicationContext的事件机制的相关文章

Spring中ApplicationContext的事件机制(一 )

在Windows编程中,我们常常需要处理各类事件,比如鼠标单击事件.双击事件.在Spring中, ApplicationContext也有发布和监听时间的能力.我们知道,在windows开发中,如果要响应某个事件,我 们只需要编写相应windows消息的响应函数就可以了.比如鼠标单击事件,相应的消息就是 WM_LBUTTONDOWN .在Spring中也是一样,Spring中ApplicationEvent类及其子类就相当于Windows中的消 息,事件监听器ApplcationListener

Spring中ApplicationContext的事件机制(二 内定事件)

在Spring中已经定义了五个标准事件,分别介绍如下: 1)ContextRefreshedEvent:当ApplicationContext初始化或者刷新时触发该事件. 2)ContextClosedEvent:当ApplicationContext被关闭时触发该事件.容器被关闭时,其管理的所有 单例Bean都被销毁. 3)RequestHandleEvent:在Web应用中,当一个http请求(request)结束触发该事件. ContestStartedEvent:Spring2.5新增的

Spring中ApplicationContext加载机制

加载器目前有两种选择:ContextLoaderListener和ContextLoaderServlet.    这两者在功能上完全等同,只是一个是基于Servlet2.3版本中新引入的Listener接口实现,而另一个基于Servlet接口实现.开发中可根据目标Web容器的实际情况进行选择.  配置非常简单,在web.xml中增加: <listener>        <listener-class>           org.springframework.web.cont

spring中DispatcherServlet的运行机制

servlet Spring中DispatcherServlet的运行机制 DispatcherServlet是spring的web框架(以下简称SpringWeb)中的核心servlet."Spring的web框架--象其它web框架一样--是一个请求驱动的web框架,其设计围绕一个能将请求分发到控制器的servlet,它也提供其它功能帮助web应用开发."----<Spring Framework 开发参考手册(中文版)>而在SpringWeb框架中这个servlet就

Spring在启动时,事件机制怎么时候可以使用?

问题描述 希望在系统启动时,或启动后立即触发事件(即context.publishEvent(event))但在InitializingBean的afterPropertiesSet方法和BeanPostProcessor的postProcessAfterInitialization方法里触发的事件仍然无效,请问该用什么样的方式触发事件呢?问题补充:1, 实现ApplicationContextAware拿到ApplicationContext来触发事件;2, 实现ApplicationList

深入解析PHP的Yii框架中的event事件机制_php技巧

事件事件可以将自定义代码"注入"到现有代码中的特定执行点.附加自定义代码到某个事件,当这个事件被触发时,这些代码就会自动执行.例如,邮件程序对象成功发出消息时可触发 messageSent 事件.如想追踪成功发送的消息,可以附加相应追踪代码到messageSent 事件. Yii 引入了名为 yii\base\Component 的基类以支持事件.如果一个类需要触发事件就应该继承 yii\base\Component 或其子类. Yii的event机制YII的事件机制,是其比较独特之处

spring中自定义Event事件的使用和浅析

在我目前接触的项目中,用到了许多spring相关的技术,框架层面的spring.spring mvc就不说了,细节上的功能也用了不少,如schedule定时任务.Filter过滤器. interceptor拦截器等等,而这一篇我要说的是spring Event自定义事件,目前的项目中似乎没怎么用,但是这一项技术貌似还蛮重要,所以也不能不掌握. 对于事件驱动模型的解释和理解,我觉得有一篇博客里说的非常好,尤其是在解释这个关系的时候,举的交通信号灯的例子非常贴切,这里就引用做一个简单的解释: 事件驱

Spring 中applicationContext.xml配置问题

问题描述 各位大神,麻烦帮我看看下面这个错怎讲解决.

spring学习笔记(16)趣谈spring 事件机制[2]:多监听器流水线式顺序处理

上一篇我们使用到的ApplicationListener是无序的,结合异步调度它能满足了我们的大部分应用场景,但现在我们来个另类的需求,我们来模拟一条作业调度流水线,它不能异步,必须按照先后次序执行不同的任务才能得到我们的最终结果. 需求示例:现在假如华中科技大学的小白想要为它的智能机器人作品申报国家创新奖,需要经过学校.省级创新科研机构.国家创新科研机构逐层审核.我们尝试通过事件来实现,核心就在监听器实现SmartApplicationListener接口.示例如下: 1. 配置事件发布者小白