Spring
中提供一些Aware相關(guān)的接口,BeanFactoryAware、 ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等,其中最常用到的是ApplicationContextAware。實(shí)現(xiàn)ApplicationContextAware的Bean,在Bean被初始后,將會(huì)被注入 ApplicationContext的實(shí)例。ApplicationContextAware
提供了publishEvent()方法,實(shí)現(xiàn)Observer(觀察者)設(shè)計(jì)模式的事件傳播機(jī)
,提供了針對(duì)Bean的事件傳播功能。通過(guò)Application.publishEvent方法,我們可以將事件通知系統(tǒng)內(nèi)所有的ApplicationListener。
Spring事件處理一般過(guò)程:
定義Event類(lèi),繼承org.springframework.context.ApplicationEvent.
編寫(xiě)發(fā)布事件類(lèi)Publisher,實(shí)現(xiàn)org.springframework.context.ApplicationContextAware接口.
覆蓋方法
setApplicationContext ( ApplicationContext?applicationContext )和發(fā)布方法
publish(Object obj)
定義時(shí)間監(jiān)聽(tīng)類(lèi)
EventListener,實(shí)現(xiàn)
ApplicationListener接口,實(shí)現(xiàn)方法
onApplicationEvent ( ApplicationEvent?event ).
?1?public?class?MessageEvent?extends
?ApplicationEvent?{
?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?
}
?1
?public?class?Publisher?implements
?ApplicationContextAware?{
?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?}
1?public?class?MessageEventListener?implements
?ApplicationListener?{
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?}
1?<beans>
2?????<bean?id="publisher"?class="Publisher"/>
3?????????<bean?id="messageEventListener"?class="MessageEventListener"/>
4?</beans>
在運(yùn)行期,ApplicationContext會(huì)自動(dòng)在當(dāng)前的所有Bean中尋找ApplicationListener接口的實(shí)現(xiàn),并將其作為事件接收對(duì)象。當(dāng)Application.publishEvent方法調(diào)用時(shí),所有的ApplicationListener接口實(shí)現(xiàn)都會(huì)被激發(fā),每個(gè)ApplicationListener可根據(jù)事件的類(lèi)型判斷是否是自己需要處理的事件,如上面的ActionListener只處理ActionEvent事件。
?
鳳凰涅槃/浴火重生/馬不停蹄/只爭(zhēng)朝夕
???? 隱姓埋名/低調(diào)華麗/簡(jiǎn)單生活/完美人生