寫(xiě)在前面的話:spring的監(jiān)聽(tīng)事件模型應(yīng)該是觀察者模式。本人項(xiàng)目里的應(yīng)用在process方法按日期同步某個(gè)庫(kù)的數(shù)據(jù),在方法最后publish一個(gè)event事件,這個(gè)事件用于后續(xù)同步過(guò)來(lái)的數(shù)據(jù)處理。事件處理采用了spring的監(jiān)聽(tīng)模型.這樣可以做到process方法與event可以異步分離執(zhí)行。(注:這個(gè)事件模型缺省使用SyncTaskExecutor來(lái)執(zhí)行l(wèi)istener的注冊(cè)event,所有該listener注冊(cè)的event事件為同步執(zhí)行的)。
當(dāng)然,spring的這個(gè)機(jī)制還有很多應(yīng)用的場(chǎng)景,就不一一列舉了。
ApplicationEvent
事件抽象類(lèi),里面只有一個(gè)構(gòu)造函數(shù)和一個(gè)timestamp。
ApplicationListener
監(jiān)聽(tīng)接口,里面只有一個(gè)onApplicationEvent方法。需要用戶(hù)自己編寫(xiě)ApplicationListener的實(shí)現(xiàn)。
ApplicationContext
spring上下文,其publishEvent方法用于通知監(jiān)聽(tīng)器(ApplicationListener的實(shí)現(xiàn))注冊(cè)event時(shí)間.
publishEvent
void publishEvent(ApplicationEvent event)
-
Notify all listeners registered with this application of an application event.
源碼解讀:
1.作為ApplicationContext的實(shí)現(xiàn)AbstractApplicationContext.java的成員變量applicationListeners,是一個(gè)ArrayList,保存了所有的ApplicationListener
2.利用ApplicationEventMulticaster接口里的方法來(lái)完成注冊(cè)監(jiān)聽(tīng)addApplicationListener,移除監(jiān)聽(tīng)removeApplicationListener,removeAllListeners,以及通知監(jiān)聽(tīng)注冊(cè)事件event:multicastEvent(ApplicationEvent event);
上面說(shuō)到的publishEvent方法即使用了multicastEvent方法
SimpleApplicationEventMultucaster作為ApplicationEventMulticaster的一個(gè)實(shí)現(xiàn),提供了multicastEvent的實(shí)現(xiàn)代碼,其實(shí)就是迭代所有的監(jiān)聽(tīng)器,用SyncTaskExecutor同步執(zhí)行l(wèi)istener的onApplicationEvent
public void multicastEvent(final ApplicationEvent event) {
for (Iterator it = getApplicationListeners().iterator(); it
.hasNext();) {
final ApplicationListener listener = (ApplicationListener) it
.next();
getTaskExecutor().execute(new Runnable() {
public void run() {
listener.onApplicationEvent(event);
}
});
}
3.注意事項(xiàng):自己編寫(xiě)ApplicationListener的實(shí)現(xiàn)時(shí),要注意不同的監(jiān)聽(tīng)器處理不同的事件(復(fù)寫(xiě)onApplicationEvent)。原因就是multicastEvent的執(zhí)行原理。它是迭代執(zhí)行所有的監(jiān)聽(tīng)器onApplicationEvent
這里是ApplicationEventMulticaster的類(lèi)分布圖
abstract public class AbstractApplicationEventMulticaster implements ApplicationEventMulticaster(Code)(Java Doc)
public interface ApplicationEventMulticaster (Code)(Java Doc)
public class SimpleApplicationEventMulticaster extends
這里是ApplicationContext的類(lèi)分布圖
public class DefaultResourceLoader implements ResourceLoader(Code)(Java Doc)
public interface ResourceLoader (Code)(Java Doc)
abstract public class AbstractApplicationContext extends
DefaultResourceLoader implements
ConfigurableApplicationContext,DisposableBean(Code)(Java Doc)
public interface ConfigurableApplicationContext extends ApplicationContext,Lifecycle(Code)(Java Doc)
public interface DisposableBean (Code)(Java Doc)
public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry(Code)(Java Doc)
public interface BeanDefinitionRegistry (Code)(Java Doc)
abstract public class AbstractRefreshableApplicationContext extends
下面是spring自身的事件應(yīng)用
1) ContextRefreshedEvent:當(dāng)ApplicationContext初始化或者刷新時(shí)觸發(fā)該事件。
2) ContextClosedEvent:當(dāng)ApplicationContext被關(guān)閉時(shí)觸發(fā)該事件。容器被關(guān)閉時(shí),其管理的所有單例Bean都被銷(xiāo)毀。
3) RequestHandleEvent:在Web應(yīng)用中,當(dāng)一個(gè)http請(qǐng)求(request)結(jié)束觸發(fā)該事件。
4) ContestStartedEvent:當(dāng)容器調(diào)用ConfigurableApplicationContext的Start()方法開(kāi)始/重新開(kāi)始容器時(shí)觸發(fā)該事件。
5) ContestStopedEvent:當(dāng)容器調(diào)用ConfigurableApplicationContext的Stop()方法停止容器時(shí)觸發(fā)該事件。