7.4.4 ApplicationContext的事件机制
ApplicationContext
的事件机制是观察者设计模式
的实现,通过ApplicationEvent
类和ApplicationListener
接口,可以实现ApplicationContext
的事件处理。如果容器中有一个ApplicationListener
Bean
每当ApplicationContext
发布ApplicationEvent
时, ApplicationListener
Bean
将自动被触发。Spring
的事件框架有如下两个重要成员。
ApplicationEvent
:容器事件,必须由ApplicationContext
发布。ApplicationListener
:监听器,可由容器中的任何监听器Bean
担任。
实际上, Spring
的事件机制与所有的事件机制都基本相似,它们都需要由事件源
、事件
和事件监听器
组成。只是此处的事件源是ApplicationContext
,且事件必须由Java
程序显式触发。
程序示例
项目结构
1 | E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\EventHandler |
下面的程序将示范Spring
容器的事件机制。程序先定义了一个ApplicationEvent
类,其对象就是个Spring
容器事件。 ApplicationEvent
类的代码如下。
beans.xml
1 | package org.crazyit.app.event; |
上面的EmailEvent
类继承了ApplicationEvent
类,除此之外,它就是一个普通的Java
类。
如何创建Spring容器的容器事件
只要个Java
类继承了ApplicationEvent
基类,那该对象就可作为Spring
容器的容器事件。
容器事件的监听器
容器事件的监听器类必须实现ApplicationListener
接口,实现该接口必须实现如下方法。onApplicationEvent(ApplicationEvent event)
:每当容器内发生任何事件时,此方法都被触发
EmailNotifier.java
本示例所用的容器监听器类的代码如下:
1 | package org.crazyit.app.listener; |
将监听器配置在容器中,配置文件如下。
beans.xml
1 |
|
从上面的粗体字代码可以看出,为Spring
容器注册事件监听器,不需要像AWT
编程那样采用代码进行编程,只要进行简单配置即可。只要在Spring
中配置一个实现了ApplicationListener
接口的Bean
,Spring
容器就会把这个Bean
当成容器事件
的事件监听器。
当系统创建Spring
容器、加载Spring
容器时会自动触发容器事件,容器事件监听器可以监听到这些事件。除此之外,程序也可调用ApplicationContext
的pulishEvent()
方法来主动触发容器事件。如下主程序使用ApplicationContext
的publishEvent()
来触发事件。
SpringTest.java
1 | package lee; |
上面程序中的两行粗体字代码创建了ApplicationEvent
对象,并通过ApplictionContex
主动触发了该事件。运行上面的程序,将看到如下执行结果:
1 | 其他事件:org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@439f5b3d, started on Sun Aug 25 23:06:44 CST 2019] |
从上面的执行结果可以看出,监听器不仅监听到程序所触发的事件,也监听到容器内置的事件。实际上,如果开发者需要在Spring
容器初始化、销毁时回调自定义方法,就可以通过上面的事件监听器来实现
提示:一如果Bean
希望发布容器事件,则该Bean
必须先获得对Spring
容器的引用。为了让Bean
获得对Spring
容器的引用,可让Bean
类实现ApplicationContextAware
或BeanFactoryAware
接口。
Spring内置事件
Spring
提供如下几个内置事件:
这里先省略,后续用到再更新…