在Spring中已經定義了五個標准事件,分別介紹如下:
1)ContextRefreshedEvent:當ApplicationContext初始化或者刷新時觸發該事件。
2)ContextClosedEvent:當ApplicationContext被關閉時觸發該事件。容器被關閉時,其管理的所有 單例Bean都被銷毀。
3)RequestHandleEvent:在Web應用中,當一個http請求(request)結束觸發該事件。
ContestStartedEvent:Spring2.5新增的事件,當容器調用ConfigurableApplicationContext的 Start()方法開始/重新開始容器時觸發該事件。
5) ContestStopedEvent:Spring2.5新增的事件,當容器調用ConfigurableApplicationContext 的Stop()方法停止容器時觸發該事件。
下面通過一個例子展示如何處理Spring內定的事件(例程3.8)。創建一個Java工程,添加Spring開發 能力後,新建ioc.test包。在包中新建ApplicationEventListener類,實現ApplicationListener接口, 在onApplicationEvent()方法中添加事件處理代碼,如下:
1 package ioc.test;
2
3 //Import省略
4 public class ApplicationEventListener implements ApplicationListener {
5
6 public void onApplicationEvent(ApplicationEvent event) {
7
8 //如果是容器刷新事件
9 if(event instanceof ContextClosedEvent ){
10 System.out.println(event.getClass().getSimpleName()+" 事件已發生!");
11 }else if(event instanceof ContextRefreshedEvent ){//如果是容器關閉事件
12 System.out.println(event.getClass().getSimpleName()+" 事件已發生!");
13 }else if(event instanceof ContextStartedEvent ){
14 System.out.println(event.getClass().getSimpleName()+" 事件已發生!");
15 }else if(event instanceof ContextStoppedEvent){
16 System.out.println(event.getClass().getSimpleName()+" 事件已發生!");
17 }else{
18 System.out.println("有其它事件發生:"+event.getClass().getName());
19 }
20
21 }
22
23 }
24
在Spring配置文件中定義一個Bean,類為ApplicationEventListener,代碼如下:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans …………
3
4 <bean id="ApplicationEventListener" class="ioc.test.ApplicationEventListener" />
5
6 </beans>
7
添加含有主方法的TesMain類,在主方法中,調用容器的相應方法,觸發Spring內定事件,代碼如下:
1 package ioc.test;
2
3 //import省略
4 public class TesMain {
5
6 public static void main(String[] args) {
7 AbstractApplicationContext ac = new ClassPathXmlApplicationContext ("applicationContext.xml");
8
9
10 // ac.refresh();//觸發ContextRefreshedEvent事件
11 ac.start(); //觸發ContextStartedEvent事件
12 ac.stop(); //觸發ContextStoppedEvent事件
13 ac.close(); //關閉容器,觸發ContextClosedEvent事件
14
15 }
16 }
17
運行主類,控制台輸出如下:
從例子中可以知道,要注冊事件監聽器,我們只需要把它配置成一個Bean即可,ApplicationContext 容器會自動將其注冊。