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

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

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

    在路上

    路上有驚慌,路上有理想

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      28 Posts :: 1 Stories :: 10 Comments :: 0 Trackbacks

    寫在前面的話:spring的監聽事件模型應該是觀察者模式。本人項目里的應用在process方法按日期同步某個庫的數據,在方法最后publish一個event事件,這個事件用于后續同步過來的數據處理。事件處理采用了spring的監聽模型.這樣可以做到process方法與event可以異步分離執行。(注:這個事件模型缺省使用SyncTaskExecutor來執行listener的注冊event,所有該listener注冊的event事件為同步執行的)。

    當然,spring的這個機制還有很多應用的場景,就不一一列舉了。

    ApplicationEvent

    事件抽象類,里面只有一個構造函數和一個timestamp。

    ApplicationListener

    監聽接口,里面只有一個onApplicationEvent方法。需要用戶自己編寫ApplicationListener的實現。

    ApplicationContext

    spring上下文,其publishEvent方法用于通知監聽器(ApplicationListener的實現)注冊event時間.

    publishEvent

    void publishEvent(ApplicationEvent event)

    Notify all listeners registered with this application of an application event.

    源碼解讀:
    1.作為ApplicationContext的實現AbstractApplicationContext.java的成員變量applicationListeners,是一個ArrayList,保存了所有的ApplicationListener
    2.利用ApplicationEventMulticaster接口里的方法來完成注冊監聽addApplicationListener,移除監聽removeApplicationListener,removeAllListeners,以及通知監聽注冊事件event:multicastEvent(ApplicationEvent event);
    上面說到的publishEvent方法即使用了multicastEvent方法

    SimpleApplicationEventMultucaster作為ApplicationEventMulticaster的一個實現,提供了multicastEvent的實現代碼,其實就是迭代所有的監聽器,用SyncTaskExecutor同步執行listener的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.注意事項:自己編寫ApplicationListener的實現時,要注意不同的監聽器處理不同的事件(復寫onApplicationEvent)。原因就是multicastEvent的執行原理。它是迭代執行所有的監聽器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自身的事件應用
    1) ContextRefreshedEvent:當ApplicationContext初始化或者刷新時觸發該事件。
    2) ContextClosedEvent:當ApplicationContext被關閉時觸發該事件。容器被關閉時,其管理的所有單例Bean都被銷毀。
    3) RequestHandleEvent:在Web應用中,當一個http請求(request)結束觸發該事件。
    4) ContestStartedEvent:當容器調用ConfigurableApplicationContext的Start()方法開始/重新開始容器時觸發該事件。
    5) ContestStopedEvent:當容器調用ConfigurableApplicationContext的Stop()方法停止容器時觸發該事件。

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

    Feedback

    # re: Spring之事件監聽 2010-09-01 10:54 @joe
    都有啥有用場景?  回復  更多評論
      

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

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

    public void run() {

    listener.onApplicationEvent(event);
    }
    });
    以上是SimpleApplicationEventMultucaster的部分代碼,它選擇的是new Runnable來執行listener  回復  更多評論
      

    # re: Spring之事件監聽 2010-09-01 11:43 阮步兵
    @@joe
    一個任務里面,比如包括上傳文件和數據處理,如果文件不必立刻相應給客戶,可以通過事件監聽的方式來實現。另外,業務流程中有郵件處理以及日志處理的,都可以在主流程結束后執行,可以選擇事件監聽方式處理。  回復  更多評論
      

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

    # re: Spring之事件監聽 2010-09-01 21:24 阮步兵
    SimpleApplicationEventMultucaster確實采用的是SyncTaskExecutor同步executor,也就是說SimpleApplicationEventMultucaster的listener都是同步執行。當一個listener有多個事件需要處理時,同步執行。  回復  更多評論
      

    主站蜘蛛池模板: 免费人成年激情视频在线观看 | 国产永久免费高清在线| 大香人蕉免费视频75| 免费理论片51人人看电影| 精品国产亚洲男女在线线电影| 亚洲日韩AV无码一区二区三区人| 黄色短视频免费看| 亚洲性日韩精品一区二区三区| 污视频网站免费在线观看| 亚洲XX00视频| www免费黄色网| 国产精品视频免费一区二区 | 女性自慰aⅴ片高清免费| 亚洲乱码一二三四区乱码| 中文字幕不卡高清免费| 亚洲AV无码成人精品区天堂| 日韩中文字幕免费视频| 全部免费国产潢色一级| 国产精品亚洲片在线va| 国产男女猛烈无遮挡免费网站| 久久青青草原亚洲av无码app| 免费在线看黄的网站| 二级毛片免费观看全程| 67pao强力打造67194在线午夜亚洲| 中国性猛交xxxxx免费看| 亚洲成在人天堂一区二区| 久久亚洲AV成人无码国产最大| 免费永久国产在线视频| 国产日韩AV免费无码一区二区| 亚洲欧洲自拍拍偷综合| 久久国产免费观看精品| 亚洲美女色在线欧洲美女| 在线观看免费大黄网站| 久久免费观看视频| 亚洲精品国产福利片| 国产18禁黄网站免费观看| 三年片在线观看免费西瓜视频 | 亚洲国产精彩中文乱码AV| 97碰公开在线观看免费视频| 久久精品夜色国产亚洲av| 青青久在线视频免费观看|