国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

Spring2.0中新的Bean類型實現(xiàn)原理

2024-07-21 02:14:37
字體:
來源:轉載
供稿:網(wǎng)友
  我們知道,在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);
     //調用子類的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
}

  結合上面的代碼,現(xiàn)在應該明白為什么只有在web應用上下文中才能使用新增加三種類型的bean了吧。當然,由于有了scope,我們也可以非常輕松的實現(xiàn)我們自己的scope,增加新用戶自定義類型的bean,然后設計出一個適合我們自己的bean工廠。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 五莲县| 柯坪县| 乌兰浩特市| 宜兰县| 丹凤县| 富蕴县| 富锦市| 双柏县| 和顺县| 蓬溪县| 兴文县| 剑川县| 芒康县| 永善县| 富川| 石家庄市| 尼木县| 唐海县| 新营市| 巧家县| 娱乐| 壶关县| 台南县| 通州区| 繁昌县| 富裕县| 西乌珠穆沁旗| 四子王旗| 七台河市| 八宿县| 柳河县| 华安县| 巴林右旗| 五指山市| 理塘县| 秦皇岛市| 余江县| 新昌县| 叙永县| 崇文区| 武川县|