<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    在路上

    路上有驚慌,路上有理想

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      28 Posts :: 1 Stories :: 10 Comments :: 0 Trackbacks

    寫在前面的話: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ā)該事件。

    posted on 2010-09-01 10:41 阮步兵 閱讀(5351) 評(píng)論(6)  編輯  收藏 所屬分類: OpenSource

    Feedback

    # re: Spring之事件監(jiān)聽 2010-09-01 10:54 @joe
    都有啥有用場(chǎng)景?  回復(fù)  更多評(píng)論
      

    # re: Spring之事件監(jiān)聽[未登錄] 2010-09-01 11:30 毛掌柜
    @@joe
    比如在facebook中,一般上傳一張照片都會(huì)對(duì)于一個(gè)activity的產(chǎn)生,這個(gè)時(shí)候就可以用這個(gè)東西。
    記得SimpleApplicationEventMultucaster的listener都是同步執(zhí)行,需要再瞧瞧代碼。。。  回復(fù)  更多評(píng)論
      

    # re: Spring之事件監(jiān)聽 2010-09-01 11:41 阮步兵
    getTaskExecutor().execute(new Runnable() {

    public void run() {

    listener.onApplicationEvent(event);
    }
    });
    以上是SimpleApplicationEventMultucaster的部分代碼,它選擇的是new Runnable來(lái)執(zhí)行l(wèi)istener  回復(fù)  更多評(píng)論
      

    # re: Spring之事件監(jiān)聽 2010-09-01 11:43 阮步兵
    @@joe
    一個(gè)任務(wù)里面,比如包括上傳文件和數(shù)據(jù)處理,如果文件不必立刻相應(yīng)給客戶,可以通過事件監(jiān)聽的方式來(lái)實(shí)現(xiàn)。另外,業(yè)務(wù)流程中有郵件處理以及日志處理的,都可以在主流程結(jié)束后執(zhí)行,可以選擇事件監(jiān)聽方式處理。  回復(fù)  更多評(píng)論
      

    # re: Spring之事件監(jiān)聽[未登錄] 2010-09-01 13:20 毛掌柜
    @阮步兵
    看了下Spring 3的代碼,確實(shí)是同步的。
    可以看下SyncTaskExecutor的代碼。  回復(fù)  更多評(píng)論
      

    # re: Spring之事件監(jiān)聽 2010-09-01 21:24 阮步兵
    SimpleApplicationEventMultucaster確實(shí)采用的是SyncTaskExecutor同步executor,也就是說SimpleApplicationEventMultucaster的listener都是同步執(zhí)行。當(dāng)一個(gè)listener有多個(gè)事件需要處理時(shí),同步執(zhí)行。  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 国产在线观看xxxx免费| 美女隐私免费视频看| 中文字幕在线视频免费| 亚洲精品一级无码中文字幕| 苍井空亚洲精品AA片在线播放| 好吊妞在线新免费视频| 亚洲av日韩专区在线观看| 国产无遮挡裸体免费视频 | 色屁屁在线观看视频免费| 在线观看91精品国产不卡免费| 亚洲欧美国产国产一区二区三区| 国内自产拍自a免费毛片| 亚洲国产欧美一区二区三区| 日日AV拍夜夜添久久免费| 一级毛片免费观看不收费| 国产亚洲精品影视在线产品| 你懂的免费在线观看| 亚洲国产二区三区久久| 4399好看日本在线电影免费| 亚洲国产日韩在线人成下载| 日韩成人免费视频播放| jizz免费在线观看| 亚洲av无码无在线观看红杏| 青娱乐免费在线视频| 亚洲av成人一区二区三区观看在线| 亚洲成AⅤ人影院在线观看| 永久免费av无码入口国语片| 亚洲经典在线中文字幕| 国产男女猛烈无遮档免费视频网站| 免费又黄又爽又猛大片午夜| 亚洲av无码专区在线播放| 亚洲成人在线免费观看| 真正全免费视频a毛片| 亚洲热妇无码AV在线播放| 免费精品国产日韩热久久| 看亚洲a级一级毛片| 亚洲AV无码欧洲AV无码网站| 性感美女视频免费网站午夜| 97在线免费观看视频| 国产成人亚洲精品| 丁香五月亚洲综合深深爱|