5.12.2 事件处理
通过 ApplicationEvent类和 ApplicationListener接口,可实现 ApplicationContext 的事件处理。如果容器中有一个 ApplicationListener bean,每当 ApplicationContext 发布ApplicationEvent时,ApplicationListenerbean将自动响应,这是标准的观察者模式。Spring 的事件框架有如下两个重要成员。
ApplicationEvent: 容器事件,必须由 ApplicationContext 发布。
ApplicationListener: 监听器,可由容器中的任何监昕器 bean 担任。
以下是个简单的容器事件类,该类继承 ApplicationEvent。代码如下:
public class EmailListEvent extends ApplicationEvent { public EmailListEvent(Object source) { super(source); } public EmailListEvent(Object source,String address,String text) { super(source); this.address=address; this.text = text; |
voidonApplicationEvent(ApplicationEventevent) |
//监昕器类,实现ApplicationListener接口 public classEmailNotifier implementsApplicationListener //实现 ApplicationListener接口必须实现的方法,该方法会在容器发生事件时自动触发 public void onApplicationEvent(ApplicationEvent evt) //如果事件是程序触发的事件 if (evt instanceof EmailEvent) //发送 E-mail通知...EmailEvent emailEvent = (EmailEvent)evt; System.out.println("需要发送邮件的接收地址 +emailEvent.address); System.out.println("需要发送邮件的邮件正文" + emailEvent.text); } else //容器内置事件不作任何处理 System.out.println("容器本身的事件" + evt); 将监昕器配置在容器中,配置文件如下= <?xml version="l.O" encoding="gb23l2"?> <!指定 Spring 配置文件的dtd> <lDOCTYPE beans PUBLIC"-//SPRiNG//DTDBEANIlEN" ''http://www.springframework.org/dtd/spri口g-beans.dtd"> <! --Spring配置文件的根元素一〉 <beans><!--配置监听器类--> <bean id="emailListListener" class="lee.EmailNotifier"l> </beans> |
public classSpringTest public static void main(String[] args) { ApplicationContext ctx =newFileSystemXrnl ApplicationContext("bean.xml");EmailEvent ele = new EmailEvent("hello" , "kongyeeku@gmail.com", "thisisatest");ctx.publishEvent(ele); |
[java] 容器本身的事件。rg.springframework.context.event.ContextRefreshed Event[source=org.springframework.context.support.FileSystemXrnlApplicationC ontext: display name[org.springframework.context. support.FileSystemXrnlApplicationContext;hashCode=76l5385]; startup date [Mon May 08 16:54:39 CST 2006]; root of contexthierarchy] [java] 需要发送邮件的接收地址kongyeeku@gmail.com [java] 需要发送邮件的邮件正文this is a test |
此时监昕器不仅监昕到程序发布的事件,同时也监昕到容器内置的事件。
注意:如果 bean 想发布事件,则 bean 必须获得其容器的引用,应通过实现BeanFactoryAware接口达到此目的。
Spring提供了以下三个内置事件:
ContextRefreshedEven: ApplicationContext容器初始化或刷新触发该事件。
ContextClosedEvent: ApplicationContext容器关闭时触发该事件。
RequestHandledEvent: Web 相关的事件,只能应用于使用DispatcherServlet的 Web应用。