寫在前面的話:spring的監(jiān)聽事件模型應(yīng)該是觀察者模式。本人項(xiàng)目里的應(yīng)用在process方法按日期同步某個(gè)庫(kù)的數(shù)據(jù),在方法最后publish一個(gè)event事件,這個(gè)事件用于后續(xù)同步過來(lái)的數(shù)據(jù)處理。事件處理采用了spring的監(jiān)聽模型.這樣可以做到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
事件抽象類,里面只有一個(gè)構(gòu)造函數(shù)和一個(gè)timestamp。
ApplicationListener
監(jiān)聽接口,里面只有一個(gè)onApplicationEvent方法。需要用戶自己編寫ApplicationListener的實(shí)現(xiàn)。
ApplicationContext
spring上下文,其publishEvent方法用于通知監(jiān)聽器(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)聽addApplicationListener,移除監(jiān)聽removeApplicationListener,removeAllListeners,以及通知監(jiān)聽注冊(cè)事件event:multicastEvent(ApplicationEvent event);
上面說到的publishEvent方法即使用了multicastEvent方法
SimpleApplicationEventMultucaster作為ApplicationEventMulticaster的一個(gè)實(shí)現(xiàn),提供了multicastEvent的實(shí)現(xiàn)代碼,其實(shí)就是迭代所有的監(jiān)聽器,用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):自己編寫ApplicationListener的實(shí)現(xiàn)時(shí),要注意不同的監(jiān)聽器處理不同的事件(復(fù)寫onApplicationEvent)。原因就是multicastEvent的執(zhí)行原理。它是迭代執(zhí)行所有的監(jiān)聽器onApplicationEvent
這里是ApplicationEventMulticaster的類分布圖
abstract public class AbstractApplicationEventMulticaster implements ApplicationEventMulticaster(Code)(Java Doc)
public interface ApplicationEventMulticaster (Code)(Java Doc)
public class SimpleApplicationEventMulticaster extends
這里是ApplicationContext的類分布圖
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都被銷毀。
3) RequestHandleEvent:在Web應(yīng)用中,當(dāng)一個(gè)http請(qǐng)求(request)結(jié)束觸發(fā)該事件。
4) ContestStartedEvent:當(dāng)容器調(diào)用ConfigurableApplicationContext的Start()方法開始/重新開始容器時(shí)觸發(fā)該事件。
5) ContestStopedEvent:當(dāng)容器調(diào)用ConfigurableApplicationContext的Stop()方法停止容器時(shí)觸發(fā)該事件。