javascript
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 | publicclass EmailEvent extendsApplicationEvent{ privateString address; privateString text; publicEmailEvent(Object source, String address, String text){ super(source); this.address = address; this.text = text; } publicEmailEvent(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 | publicclass EmailNotifier implementsApplicationListener{ publicvoid onApplicationEvent(ApplicationEvent event) { if(event instanceofEmailEvent) { EmailEvent emailEvent = (EmailEvent)event; System.out.println("郵件地址:"+ emailEvent.getAddress()); System.our.println("郵件內容:"+ emailEvent.getText()); }else{ System.our.println("容器本身事件:"+ event); } } } |
將監聽器配置在Spring的容器中,代碼如下:
| 1 | <beanclass="com.abc.EmailNotifier"/> |
為Spring容器注冊監聽器,不需要像AWT編程那樣采用代碼進行注冊,只需要在Spring的配置文件中進行簡單配置即可。當我們住唉Spring中配置了一個實現了ApplicationListener的Bean,Spring容器就會把這個Bean當成容器事件的監聽器。
當系統創建Spring容器、加載Spring容器時會自動觸發容器事件,容器事件監聽器可以監聽到這些事件。除此之外,程序也可以調用ApplicationContext的publishEvent()方法來主動觸發一個容器事件,如下是一個例子:
| 1 2 3 4 5 6 7 8 9 | publicclass SpringTest { publicstatic void main(String args[]){ ApplicationContext context = newClassPathXmlApplicationContext("bean.xml"); //創建一個ApplicationEvent對象 EmailEvent event = newEmailEvent("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處理用戶請求結束后,系統會自動觸發該事件。
from:?http://www.importnew.com/20890.html
總結
以上是生活随笔為你收集整理的Spring中ApplicationContext的事件机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring中你不知道的注入方式
- 下一篇: 高性能的关键:Spring MVC的异步