1. 程式人生 > >FactoryBean的使用--轉

FactoryBean的使用--轉

一般情況下,Spring通過反射機制利用bean的class屬性指定實現類來例項化bean 。在某些情況下,例項化bean過程比較複雜,如果按照傳統的方式,則需要在<bean>中提供大量的配置資訊,配置方式的靈活性是受限的,這時採用編碼的方式可能會得到一個簡單的方案。Spring為此提供了一個org.Springframework.bean.factory.FactoryBean的工廠類介面,使用者可以通過實現該介面定製例項化bean的邏輯。

FactoryBean介面對於Spring框架來說佔有重要的地位,Spring 自身就提供了70多個FactoryBean的實現。它們隱藏了例項化一些複雜bean的細節,給上層應用帶來了便利。從Spring 3.0 開始, FactoryBean開始支援泛型,即介面宣告改為FactoryBean<T> 的形式:
 

package org.Springframework.beans.factory;    
public interface FactoryBean<T> {    
   T getObject() throws Exception;    
   Class<?> getObjectType();    
   boolean isSingleton();    
} 

在該介面中還定義了以下3個方法。

T getObject():返回由FactoryBean建立的bean例項,如果isSingleton()返回true,則該例項會放到Spring容器中單例項快取池中。

boolean isSingleton():返回由FactoryBean建立的bean例項的作用域是singleton還是prototype。

Class<T> getObjectType():返回FactoryBean建立的bean型別。

當配置檔案中<bean>的class屬性配置的實現類是FactoryBean時,通過 getBean()方法返回的不是FactoryBean本身,而是FactoryBean#getObject()方法所返回的物件,相當於FactoryBean#getObject()代理了getBean()方法。例如:如果使用傳統方式配置下面Car的<bean>時,Car的每個屬性分別對應一個<property>元素標籤。

public   class  Car  {    
       private   int maxSpeed ;    
       private  String brand ;    
       private   double price ;    
      //get/set方法  

如果用FactoryBean的方式實現就會靈活一些,下例通過逗號分割符的方式一次性地為Car的所有屬性指定配置值:
 

public   class  CarFactoryBean  implements  FactoryBean<Car>  {    
    private  String carInfo ;    
    public  Car getObject ()   throws  Exception  {    
        Car car =  new  Car () ;    
        String []  infos =  carInfo .split ( "," ) ;    
        car.setBrand ( infos [ 0 ]) ;    
        car.setMaxSpeed ( Integer. valueOf ( infos [ 1 ])) ;    
        car.setPrice ( Double. valueOf ( infos [ 2 ])) ;    
        return  car;    
    }    
    public  Class<Car> getObjectType ()   {    
        return  Car. class ;    
    }    
    public   boolean  isSingleton ()   {    
        return   false ;    
    }    
    public  String getCarInfo ()   {    
        return   this . carInfo ;    
    }    
    
    // 接受逗號分割符設定屬性資訊    
    public   void  setCarInfo ( String carInfo )   {    
        this . carInfocarInfo  = carInfo;    
    }    
}     

有了這個CarFactoryBean後,就可以在配置檔案中使用下面這種自定義的配置方式配置Car Bean了:
 

<bean id="car" class="com.test.factorybean.CarFactoryBean" carInfo="超級跑車,400,2000000"/> 

當呼叫getBean("car") 時,Spring通過反射機制發現CarFactoryBean實現了FactoryBean的介面,這時Spring容器就呼叫介面方法CarFactoryBean#getObject()方法返回。如果希望獲取CarFactoryBean的例項,則需要在使用getBean(beanName) 方法時在beanName前顯示的加上 "&" 字首,例如getBean("&car")。
 

轉自:http://book.51cto.com/art/201311/419081.htm

相關推薦

FactoryBean的使用--

一般情況下,Spring通過反射機制利用bean的class屬性指定實現類來例項化bean 。在某些情況下,例項化bean過程比較複雜,如果按照傳統的方式,則需要在<bean>中提供大量的配置資訊,配置方式的靈活性是受限的,這時採用編碼的方式可能會得到一個簡單的方案。Spring為此提供了一個or

python編程(python開發的三種運行模式)【

阻塞 data tail 驗證 目錄 pro 什麽 read bus 轉自:http://blog.csdn.net/feixiaoxing/article/details/53980886 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 目錄(?)[-]

() Learning Deep Learning with Keras

trees create pda sse caffe latex .py encode you Learning Deep Learning with Keras Piotr Migda? - blog Projects Articles Publications Res

PHP學習路線[]

訪問 驗證 開發技術 adc 階段 javascrip 性能 導航 段落 第一階段第一講,WEB基礎 1.1 網站基本知識; 1.2 網絡協議介紹; 1.3 B/S與C/S結構的區別; 1.4 WEB編程、網站開發技術介紹。 第二講,網頁設計

Linux SWAP 交換分區配置說明()

一個 bcd 文件添加 extend cond amoeba boot 實現 1.5 一.SWAP 說明 1.1 SWAP 概述 當系統的物理內存不夠用的時候,就需要將物理內存中的一部分空間釋放出來,以供當前運行的程序使用。那些被釋放的空間可能來自一些很長時間沒有什

】集群/分布式環境下5種session處理策略

學習 原理 memcache 可選 ret 當前 memcach uil 服務器 轉載至:http://blog.csdn.net/u010028869/article/details/50773174 在搭建完集群環境後,不得不考慮的一個問題就是用戶訪問產生的sessi

://Oracle補丁及opatch工具介紹

獨立 管理所 無效對象 rim 計劃 目錄 conn 技術 有時 一. CPU(Critical Patch Update) 一個CPU內包含了對多個安全漏洞的修復,並且也包括相應必需的非安全漏洞的補丁。CPU是累積型的,只要安裝最新發布的CPU即可,其中包括之前

)web開發流程

ctu 圖片 hit 處理 隨著 使用 一個bug 原型開發 href a、項目經理與公司決策層的溝通,以確定這個需求有沒有足夠的人手和可行性去實現,以及與現有產品的依存關系。  b、公司決策層與市場/策劃部門的交流,這個過程將進行的相當充分,並且是反復、長期的,它致力於

鏡像的分層結構 - 每天5分鐘玩容器技術(11)

數據 9.png upload 問題: 所有 rfi image tle acs Docker 支持通過擴展現有鏡像,創建新的鏡像。 實際上,Docker Hub 中 99% 的鏡像都是通過在 base 鏡像中安裝和配置需要的軟件構建出來的。比如我們現在構建一個新的鏡像,

Java中byteint的方法

article 強制 能夠 java 等等 content 應用場景 ffffff 計算 byte轉化為int有兩種情況: 1)要保持數值不變 應用場景:數值計算,等等。 方法:能夠直接採用強制類型轉換:int i = (int) aByte, 比如:若aByte=0x

】PHP開發經驗之談,看了受益非淺

his 則表達式 處理 手冊 調用 緩存系統 字符串操作函數 如果能 諸多 用單引號代替雙引號來包含字符串,這樣做會更快一些。因為PHP會在雙引號包圍的字符串中搜尋變量,單引號則不會,註意:只有echo能這麽做,它是一種可以把多個字符串當作參數的“函數”(譯註:PHP手冊中

(存 作者未知)深入理解HTML協議

期望 intern 屬於 公告欄 機制 被拒 定向 圖片 工具欄 深入理解HTML協議 http協議學 習系列 1. 基礎概念篇 1.1 介紹 HTTP是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫。它的發展是萬維網協會(World

從此編寫 Bash 腳本不再難【

class 創建 截圖 補全 文件類型 當前 comment sin 效率 從此編寫 Bash 腳本不再難 原創 Linux技術 2017-05-02 14:30 在這篇文章中,我們會介紹如何通過使用 bash-support vim 插件將 Vim 編

少是指數級的多(

管理 blank 自己 als 參數模板 ria tube temp 謝謝 轉自 http://www.oschina.net/news/30584 原文 Less is exponentially more 是 Rob Pike 自己整理的他在六月22日,舊金山的 G

()!註意:PreTranslateMessage彈出框出錯

成員變量 缺省 保存 失效 key ssa 非模態窗口 之前 close dlg.DoModal()截住了界面消息,所以返回時原來的pMsg的內容已經更改了,消息,窗口句柄都不在是if以前的值了,而且窗口句柄應該是對話框裏的子窗口的句柄,所以調用CFrameWnd::Pre

:Java中String與byte[]的轉換

輸出字符串 單個字符 linu 編輯 繁體 中國人 對象 本質 計算機基礎知識 String s = "fs123fdsa";//String變量 byte b[] = s.getBytes();//String轉換為byte[] String t = new Stri

【iOS開發-79】利用Modal方式實現控制器之間的跳

article 運用 mis cli 控制 present 沒有 dismiss 導航控制器 利用Modal方法。事實上就是以下兩個方法的運用。Modal方式的切換效果是從底部呈現。 -(void)clickModal{ WPViewController *wp

字典json字符串方法

mutable nbsp bject pla error: tab 空格 字符串 arc [self convertToJsonData:_editDictionary]; /** 字典轉json字符串方法 */ -(NSString *)convertToJsonData

實戰:MySQL Sending data導致查詢很慢的問題詳細分析()

sql 格式 一段 ace 研究 軟件測試 tar 遊戲 很好 這兩天幫忙定位一個MySQL查詢很慢的問題,定位過程綜合各種方法、理論、工具,很有代表性,分享給大家作為新年禮物:) 【問題現象】 使用sphinx支持倒排索引,但sphinx從mysql查詢源數據的

Html中嵌套其他HTML文件的幾種方法(

java mar net rip gin bsp ace wid style 給大家整理了3個方法,一個是HTML的iframe標簽,別兩個是JS引用。比如要在arr.html文件裏引用index.html文件,方法如下。 HTML引用方法: <iframe na