ApplicationContext事件機制是觀察者設計模式的實現,經過ApplicationEvent類和ApplicationListener接口,能夠實現ApplicationContext事件處理。若是容器中有一個ApplicationListener Bean,每當ApplicationContext發佈ApplicationEvent時,ApplicationListener Bean將自動被觸發。前端
Spring的事件框架有以下兩個重要的成員:java
ApplicationEvent:容器事件,必須由ApplicationContext發佈編程
ApplicationListener:監聽器,可由容器中的任何監聽器Bean擔任設計模式
實際上,Spring的事件機制與全部時間機制都基本類似,它們都須要事件源、事件和事件監聽器組成。只是此處的事件源是ApplicationContext,且事件必須由Java程序顯式觸發。下面的程序將演示Spring容器的事件機制。程序先定義了一個ApplicationEvent類,其對象就是一個Spring容器事件。代碼以下:框架
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類。this
容器事件的監聽器類必須實現ApplicationListener接口,實現該接口就必須實現以下方法: spa
onApplicationEvent(ApplicationEvent event):每當容器內發生任何事件時,此方法都會被觸發設計
本例所使用的容器監聽器類代碼以下:code
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的容器中,代碼以下:xml
<bean class="com.abc.EmailNotifier" />
爲Spring容器註冊監聽器,不須要像AWT編程那樣採用代碼進行註冊,只須要在Spring的配置文件中進行簡單配置便可。當咱們住唉Spring中配置了一個實現了ApplicationListener的Bean,Spring容器就會把這個Bean當成容器事件的監聽器。
當系統建立Spring容器、加載Spring容器時會自動觸發容器事件,容器事件監聽器能夠監聽到這些事件。除此以外,程序也能夠調用ApplicationContext的publishEvent()方法來主動觸發一個容器事件,以下是一個例子:
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處理用戶請求結束後,系統會自動觸發該事件。