事件機制作為一種編程機制,在許多語言中都提供了支持。
JAVA語言也不例外,java中的事件機制的參與者有3種角色:
1.event object
2.event source
3.event listener
這三個角色的含義字面上很好解,它們就定義了事件機制的一個基本模型。作為一種常用的編程設計機制,許多開源框架的設計中都使用了事件機制。SpringFramework也不例外,
下面着重闡述個人對spring中的事件機制的一些理解。其中一個主要的使用場景是用在IOC的容器的啟動過程,當所有的bean都已經處理完成之后,spring ioc容器會有一個發布
事件的動作,代碼詳見org.springframework.context.support.AbstractApplicationContext類的finishRefresh()方法:
protected void finishRefresh() {
// Initialize lifecycle processor for this context.
initLifecycleProcessor();
// Propagate refresh to lifecycle processor first.
getLifecycleProcessor().onRefresh();
// Publish the final event.
publishEvent(new ContextRefreshedEvent(this));
// Participate in LiveBeansView MBean, if active.
LiveBeansView.registerApplicationContext(this);
}
這樣,當
ioc容器加載處理完相應的bean之后,也給我們提供了一個機會(先有InitializingBean,后有ApplicationListener<ContextRefreshedEvent>),可以去做一些自己想做的事。其實這也就是spring ioc容器給提供的一個擴展的地方。我們可以這樣使用這個擴
展機制,首先需要認識幾個相關的接口
org.springframework.context.ApplicationEvent
org.springframework.context.ApplicationListener
一個最簡單的方式就是,讓我們的bean實現ApplicationListener接口,這樣當發布事件時,spring的ioc容器就會以容器的實例對象作為事件源類,並從中找到事件的監聽者,此時
ApplicationListener接口實例中的onApplicationEvent(E event)方法就會被調用,我們的邏輯代碼就會寫在此處。這樣我們的目的就達到了。但這也帶來一個思考,有人可能會
想,這樣的代碼我們也可以通過實現spring的InitializingBean接口來實現啊,也會被spring容器去自動調用,但是大家應該想到,
如果我們現在想做的事,是必須要等到所有的
bean都被處理完成之后再進行,此時InitializingBean接口的實現就不合適了,所以需要深刻理解事件機制的應用場合。