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

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

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

    隨筆 - 115  文章 - 481  trackbacks - 0
    <2006年8月>
    303112345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(19)

    隨筆檔案(115)

    文章檔案(4)

    新聞檔案(1)

    成員連接

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

      我們知道,在Spring2.0中,除了singleton及prototype兩種類型的Bean以外。默認情況下還增加了request、session及global?session三種類型的Bean,增加的三種類型的Bean主要應用于Web應用程序中。本文不打算分析三種類型的Bean的用法,只是簡單分析框架的實現(xiàn)原理。
      Spring2.0中新增了一個用來表示Bean范圍的Scope接口
      public?interface?Scope?{
      Object?get(String?name,?ObjectFactory?objectFactory);//根據(jù)名稱及創(chuàng)建工廠得到一個Bean實例
      Object?remove(String?name);//刪除一個指定名稱的Bean
      }

      在容器ConfigurableBeanFactory接口中定義了Bean工廠有關Scope注冊的相關方法,使得可往Bean工廠中加入新類型的Bean。
      public?interface?ConfigurableBeanFactory?extends?HierarchicalBeanFactory,
      void?registerScope(String?scopeName,?Scope?scope);//往Bean工廠中添加一個新的范圍(默認只有兩種范圍:singleton及prototype)
      void?destroyScopedBean(String?beanName);//銷毀B?ean工廠中范圍Bean
      }

      在AbstractFactoryBean的getBean方法中實現(xiàn)了對特定Scope?Bean支持,核心代碼摘要:

    ????String?scopeName?=?mergedBeanDefinition.getScope();//取得當前Bean的范圍,也即在定義中的scope=”request”的部分。
    ????Scope?scope?=?(Scope)?this.scopes.get(scopeName);//得到Bean工廠中的范圍處理器
    ????if?(scope?==?null)?{
    ?????throw?new?IllegalStateException("No?Scope?registered?for?scope?'"?+?scopeName?+?"'");
    ????}
    ????try?{
    //使用scope.get(beanName,ObjectFactory)從指定的范圍中得到或創(chuàng)建Bean實例
    ?????Object?scopedInstance?=?scope.get(beanName,?new?ObjectFactory()?{
    ??????public?Object?getObject()?throws?BeansException?{
    ???????beforePrototypeCreation(beanName);//前攔截
    ???????try?{
    ????????return?createBean(beanName,?mergedBeanDefinition,?args);//調(diào)用子類的createBean實現(xiàn)真正的Bean創(chuàng)建工作
    ???????}
    ???????finally?{
    ????????afterPrototypeCreation(beanName);//后攔截
    ???????}
    ??????}
    ?????});
    ?????bean?=?getObjectForBeanInstance(scopedInstance,?name,?mergedBeanDefinition);//返回正確類型的Bean實例
    ????}
    ????catch?(IllegalStateException?ex)?{
    ?????throw?new?BeanCreationException(beanName,?"Scope?'"?+?scopeName?+?"'?is?not?active",?ex);
    ????}

      默認情況下,低層的Bean工廠中只支持singleton及prototype兩種類型的Bean。當把scope設置成request及session時將會出現(xiàn)不能正確識別Scope的錯誤。這是因為普通的Bean工廠都沒有注冊新的Scope。只有在WebApplicationContext中注冊才注冊了新類型的Bean。
      下面看實現(xiàn)注冊Scope的代碼:
      在WebApplicationContext中定義常量
      public?interface?WebApplicationContext?extends?ApplicationContext?{
      String?SCOPE_REQUEST?=?"request";
      String?SCOPE_SESSION?=?"session";
     String?SCOPE_GLOBAL_SESSION?=?"globalSession";
    }

      然后在所有類型的Web應用上下文的實現(xiàn)中,都在Bean工廠的攔載過程中通過postProcessBeanFactory方法來注冊新類型Scope,如GenericWebApplicationContext、StaticWebApplicationContext、AbstractRefreshableWebApplicationContext等WebApplication應用上下文實現(xiàn)中。
      protected?void?postProcessBeanFactory(ConfigurableListableBeanFactory?beanFactory)?{
      ??beanFactory.registerScope(SCOPE_REQUEST,?new?RequestScope());//注冊request類型的Bean
      ??beanFactory.registerScope(SCOPE_SESSION,?new?SessionScope(false));//注冊session類型的Bean
      ??beanFactory.registerScope(SCOPE_GLOBAL_SESSION,?new?SessionScope(true));//注冊glogalsession  的Bean
    }

      結(jié)合上面的代碼,現(xiàn)在應該明白為什么只有在Web應用上下文中才能使用新增加三種類型的Bean了吧。當然,由于有了Scope,我們也可以非常輕松的實現(xiàn)我們自己的Scope,增加新用戶自定義類型的Bean,然后設計出一個適合我們自己的Bean工廠。

    ?

    由于水平有限,文中不足之處歡迎廣大Spring愛好者不吝指教,請“春迷”勿攏!?

    (注:本文作者,EasyJF開源團隊 大峽,轉(zhuǎn)載請保留作者聲明!)
    posted on 2006-08-11 09:11 簡易java框架 閱讀(1061) 評論(1)  編輯  收藏

    FeedBack:
    # re: Spring2.0中新的Bean類型實現(xiàn)原理 2006-08-11 20:07 綠色使者、綠色心情
    挺不錯的,要是能再具體介紹一些使用這些scope的用法就好了  回復  更多評論
      

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 亚洲Aⅴ无码一区二区二三区软件 亚洲AⅤ视频一区二区三区 | 2020久久精品国产免费| 亚洲理论片在线中文字幕| 免费看成人AA片无码视频羞羞网| 菠萝菠萝蜜在线免费视频| 国产AⅤ无码专区亚洲AV| 精品成在人线AV无码免费看| 欧美激情综合亚洲一二区| 亚洲人成人一区二区三区| 成人人观看的免费毛片| av电影在线免费看| 亚洲人成网站日本片| 亚洲性日韩精品国产一区二区| 1000部啪啪毛片免费看| 一区二区视频在线免费观看| 亚洲视频在线不卡| 亚洲欧洲日产国码高潮αv| 西西大胆无码视频免费| 少妇人妻偷人精品免费视频| 亚洲av日韩专区在线观看| 亚洲AV无码国产剧情| 美女一级毛片免费观看 | 久久久综合亚洲色一区二区三区| 在线观看免费a∨网站| 国产一卡二卡≡卡四卡免费乱码| 91精品成人免费国产片| 成年女人毛片免费视频| 999任你躁在线精品免费不卡| 四虎一区二区成人免费影院网址 | 亚洲av综合色区| 亚洲精品无码日韩国产不卡?V| 亚洲成a人片在线观看久| 日韩在线看片免费人成视频播放| 99国产精品永久免费视频| 午夜时刻免费入口| 亚洲精品视频免费| 亚洲视频国产视频| 久久人午夜亚洲精品无码区 | 伊人久久五月丁香综合中文亚洲 | 国产视频精品免费| 成人免费无码大片A毛片抽搐色欲|