<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)論
      

    主站蜘蛛池模板: 久久99精品视免费看| 亚洲日韩中文字幕在线播放| 久久精品国产亚洲网站| 校园亚洲春色另类小说合集 | 99热这里只有精品免费播放| 亚洲熟妇中文字幕五十中出| 99久9在线|免费| 无码亚洲成a人在线观看| 夭天干天天做天天免费看| 亚洲伊人久久大香线蕉影院| 免费毛片在线播放| a级成人毛片免费视频高清| 国产亚洲美女精品久久久2020| 亚洲黄片手机免费观看| 亚洲国产精品综合久久网各| 亚洲国产成人久久综合一区77| 99爱视频99爱在线观看免费| 国产精品亚洲色图| 亚洲福利电影一区二区?| 2020久久精品国产免费| 日韩毛片一区视频免费| 亚洲中文字幕无码爆乳AV| 无码中文字幕av免费放| 国产在线观看免费视频软件 | 国产精品综合专区中文字幕免费播放 | 国产精品亚洲综合网站| 亚洲天堂视频在线观看| 亚洲精品国产精品国自产观看| 日韩免费a级毛片无码a∨| 大地资源中文在线观看免费版| 国产精品久久久久久亚洲影视| 亚洲精品美女久久久久| 亚洲啪啪综合AV一区| 午夜亚洲福利在线老司机| 成年女人男人免费视频播放| 99视频在线看观免费| 久久久受www免费人成| 真人无码作爱免费视频| 中文字幕亚洲精品无码| 亚洲第一精品电影网| 亚洲av无码潮喷在线观看|