Spring筆記之四(Spring Event)
Spring 中提供一些Aware相關的接口,BeanFactoryAware、 ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等,其中最常用到的是ApplicationContextAware。實現ApplicationContextAware的Bean,在Bean被初始后,將會被注入 ApplicationContext的實例。ApplicationContextAware 提供了publishEvent()方法,實現Observer(觀察者)設計模式的事件傳播機 ,提供了針對Bean的事件傳播功能。通過Application.publishEvent方法,我們可以將事件通知系統內所有的ApplicationListener。
Spring事件處理一般過程:
定義Event類,繼承org.springframework.context.ApplicationEvent.
編寫發布事件類Publisher,實現
定義時間監聽類
org.springframework.context.ApplicationContextAware接口.
覆蓋方法
setApplicationContext ( ApplicationContext?applicationContext )和發布方法
publish(Object obj)
EventListener,實現
ApplicationListener接口,實現方法
onApplicationEvent ( ApplicationEvent?event ).
?2??????/**
?3? ?????*?
?4??????*/
?5?????private?static?final?long?serialVersionUID?=?1L ;
?6?????private ?String?msg;
?7?????????public ?MessageEvent(Object?source,?String?msg)?{
?8?????????????super (source);
?9?????????????this.msg?= ?msg;
10? ????????}
11? ????????
12?????????public ?String?getMessage()?{
13?????????????return ?msg;
14? ????????}
15? }
?2?
?3??????private ?ApplicationContext?ctx;
?4?
?5?????????public?void ?setApplicationContext(ApplicationContext?applicationContext)
?6?????????????????throws ?BeansException?{
?7?????????????this.ctx?= ?applicationContext;
?8?
?9? ????????}
10?
11?????????public?void ?publish(String?message)?{
12?????????????ctx.publishEvent(new?MessageEvent(this ,?message));
13? ????????}
14? ????????
15?????????public?static?void ?main(String[]?args)?{
16?????????????ApplicationContext?ctx?=?new ?FileSystemXmlApplicationContext(
17?????????????????????"src/applicationContext.xml" );
18?
19?????????????Publisher?pub?=?(Publisher)?ctx.getBean("publisher" );
20?????????????pub.publish("Hello?World!" );
21?????????????pub.publish("The?quick?brown?fox?jumped?over?the?lazy?dog" );
22? ????????}
23?
24?}
2?
3???????public?void ?onApplicationEvent(ApplicationEvent?event)?{
4????????????if(event?instanceof ?MessageEvent)?{
5????????????????MessageEvent?msgEvt?= ?(MessageEvent)event;
6????????????????System.out.println("Received:?"?+ ?msgEvt.getMessage());
7? ???????????}
8? ????????}
9?}
2?????<bean?id="publisher"?class="Publisher"/>
3?????????<bean?id="messageEventListener"?class="MessageEventListener"/>
4?</beans>
在運行期,ApplicationContext會自動在當前的所有Bean中尋找ApplicationListener接口的實現,并將其作為事件接收對象。當Application.publishEvent方法調用時,所有的ApplicationListener接口實現都會被激發,每個ApplicationListener可根據事件的類型判斷是否是自己需要處理的事件,如上面的ActionListener只處理ActionEvent事件。
?
鳳凰涅槃/浴火重生/馬不停蹄/只爭朝夕
???? 隱姓埋名/低調華麗/簡單生活/完美人生
posted on 2007-09-24 22:38 poetguo 閱讀(5201) 評論(4) 編輯 收藏 所屬分類: Spring