BeanFactory與FactoryBean

  • BeanFactory
    表示它是一個(gè)工廠類(接口), 它負(fù)責(zé)生產(chǎn)和管理bean的一個(gè)工廠。在Spring中,BeanFactory是IOC容 器的核心接口,它的職責(zé)包括:實(shí)例化蔑鹦、定位、配置應(yīng)用程序中的對(duì)象及建立這些對(duì)象間的依賴箕宙。
    BeanFactory只是個(gè)接口举反,并不是IOC容器的具體實(shí)現(xiàn),但是Spring容器給出了多種實(shí)現(xiàn)扒吁,如 DefaultListableBeanFactory火鼻、XmlBeanFactory、ApplicationContext等雕崩,XmlBeanFactory就是常用的一個(gè)魁索,該實(shí)現(xiàn)將以XML方式描述組成應(yīng)用的對(duì)象及對(duì)象間的依賴關(guān)系。XmlBeanFactory類將持有此XML配置元數(shù)據(jù)盼铁,并用它來構(gòu)建一個(gè)完全可配置的系統(tǒng)或應(yīng)用粗蔚。
package org.springframework.beans.factory;  
import org.springframework.beans.BeansException;  

public interface BeanFactory {  
 
    String FACTORY_BEAN_PREFIX = "&";  //FactoryBean解引用符,getBean時(shí)加上獲取FactoryBean實(shí)例
   
    Object getBean(String name) throws BeansException;  //根據(jù)名稱獲取Bean
  
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;  
  
    <T> T getBean(Class<T> requiredType) throws BeansException;  
   
    Object getBean(String name, Object... args) throws BeansException;  
   
    boolean containsBean(String name);  //容器是否包含該名稱的Bean
   
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;  //是否為單例
   
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;  //是否為多例
    
    boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException; //查詢指定了名字的Bean的Class類型是否是特定的Class類型饶火。這個(gè)Class類型可以由用戶來指定鹏控。
   
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;  //查詢指定名字的Bean的  Class類型
    
    String[] getAliases(String name);  //獲取別名, 這些別名都是用戶在BeanDefinition中定義的。

}
  • FactoryBean
    一般情況下肤寝,Spring通過反射機(jī)制利用<bean>的class屬性指定實(shí)現(xiàn)類實(shí)例化Bean当辐,在某些情況下,實(shí)例化Bean過程比較復(fù)雜鲤看,如果按照傳統(tǒng)的方式缘揪,則需要在<bean>中提供大量的配置信息。配置方式的靈活性是受限的义桂,這時(shí)采用編碼的方式可能會(huì)得到一個(gè)簡單的方案找筝。
    Spring為此提供了一個(gè)org.springframework.bean.factory.FactoryBean的工廠類接口,用戶可以通過實(shí)現(xiàn)該接口定制實(shí)例化Bean的邏輯慷吊。 FactoryBean接口對(duì)于Spring框架來說占用重要的地位袖裕,Spring自身就提供了70多個(gè)FactoryBean的實(shí)現(xiàn)。它們隱藏了實(shí)例化一些復(fù)雜Bean的細(xì)節(jié)溉瓶,
    給上層應(yīng)用帶來了便利急鳄。從Spring3.0開始谤民,F(xiàn)actoryBean開始支持泛型,即接口聲明改為FactoryBean<T>的形式攒岛。
package org.springframework.beans.factory;  

public interface FactoryBean<T> {  
   
    T getObject() throws Exception;  //返回實(shí)例化Bean對(duì)象
   
    Class<?> getObjectType();  //返回實(shí)例化Bean的類型
  
    boolean isSingleton();  //Bean是否為單例, 為true赖临,則該實(shí)例會(huì)放到Spring容器中單實(shí)例緩存池中胞锰。

}
  • FactoryBean 使用舉例
    定義一個(gè)Car實(shí)體,包含最大速度灾锯、品牌、價(jià)格等屬性嗅榕,如果使用傳統(tǒng)方式配置下面Car的<bean>時(shí)顺饮,Car的每個(gè)屬性分別對(duì)應(yīng)一個(gè)<property>元素標(biāo)簽。
public   class  Car  {    
       private   int maxSpeed ;    
       private  String brand ;    
       private   double price ;    
      //get/set方法  
}

? 可以通過FactoryBean以分隔符的形式一次性指定所有屬性值

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 ;    
    }    
    
    // 接受逗號(hào)分割符設(shè)置屬性信息    
    public   void  setCarInfo ( String carInfo )   {    
        this.carInfocarInfo  = carInfo;    
    }    
}  

? XML配置

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

當(dāng)調(diào)用getBean("car") 時(shí)凌那,Spring通過反射機(jī)制發(fā)現(xiàn)CarFactoryBean實(shí)現(xiàn)了FactoryBean的接口兼雄,這時(shí)Spring 容器就調(diào)用接口方法CarFactoryBean的getObject()方法返回。如果希望獲取CarFactoryBean的實(shí)例帽蝶,則需要在使用getBean(beanName) 方法時(shí)在beanName前顯示的加上 "&" 前綴赦肋,例如getBean("&car")。

  • BeanFactory和FactoryBean的區(qū)別
    BeanFactory和FactoryBean其實(shí)沒有什么比較的励稳,只是兩者的名稱特別接近佃乘,BeanFactory是提供了IOC容器最基本的形式,給具體的IOC容器的實(shí)現(xiàn)提供了規(guī)范驹尼。FactoryBean可以 說為IOC容器中Bean的實(shí)現(xiàn)提供了更加靈活的方式趣避,F(xiàn)actoryBean在IOC容器的基礎(chǔ)上給Bean的實(shí)現(xiàn)加上了一個(gè)簡單工廠模式和裝飾模式,我們可以在getObject()方法中靈活配置新翎。其實(shí)在Spring源碼中有很多FactoryBean的實(shí)現(xiàn)類程帕,要想深入準(zhǔn)確的理解FactoryBean,只有去讀讀Spring源碼了。

參考鏈接

  1. [FactoryBean的使用]
  2. [Spring IoC容器的設(shè)計(jì)——BeanFactory應(yīng)用場(chǎng)景]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末地啰,一起剝皮案震驚了整個(gè)濱河市愁拭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌亏吝,老刑警劉巖敛苇,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異顺呕,居然都是意外死亡枫攀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門株茶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來来涨,“玉大人,你說我怎么就攤上這事启盛”钠” “怎么了技羔?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卧抗。 經(jīng)常有香客問我藤滥,道長,這世上最難降的妖魔是什么社裆? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任拙绊,我火速辦了婚禮,結(jié)果婚禮上泳秀,老公的妹妹穿的比我還像新娘标沪。我一直安慰自己,他們只是感情好嗜傅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布金句。 她就那樣靜靜地躺著,像睡著了一般吕嘀。 火紅的嫁衣襯著肌膚如雪违寞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天偶房,我揣著相機(jī)與錄音趁曼,去河邊找鬼。 笑死蝴悉,一個(gè)胖子當(dāng)著我的面吹牛彰阴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拍冠,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼尿这,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了庆杜?” 一聲冷哼從身側(cè)響起射众,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晃财,沒想到半個(gè)月后叨橱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡断盛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年罗洗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钢猛。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伙菜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出命迈,到底是詐尸還是另有隱情贩绕,我是刑警寧澤火的,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站淑倾,受9級(jí)特大地震影響馏鹤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娇哆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一湃累、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迂尝,春花似錦脱茉、人聲如沸剪芥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽税肪。三九已至溉躲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間益兄,已是汗流浹背锻梳。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留净捅,地道東北人疑枯。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像蛔六,于是被迫代替她去往敵國和親荆永。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1.1 Spring IoC容器和bean簡介 本章介紹了Spring Framework實(shí)現(xiàn)的控制反轉(zhuǎn)(IoC)...
    起名真是難閱讀 2,580評(píng)論 0 8
  • 1.1 spring IoC容器和beans的簡介 Spring 框架的最核心基礎(chǔ)的功能是IoC(控制反轉(zhuǎn))容器国章,...
    simoscode閱讀 6,713評(píng)論 2 22
  • spring源碼分析(二) 目錄五具钥、Spring 源碼解讀--5.1、什么是IOC/DI--5.2液兽、Spring ...
    毛子果閱讀 401評(píng)論 0 0
  • IOC和DI是什么骂删? Spring IOC 的理解,其初始化過程四啰? BeanFactory 和 FactoryBe...
    justlpf閱讀 3,474評(píng)論 1 21
  • 寫這個(gè)題目主要是裝下逼宁玫,關(guān)系或者條件順序的問題。這不是繞口令柑晒。 Kiss代表親密關(guān)系欧瘪,conditions代表?xiàng)l件...
    木瓜不是瓜閱讀 238評(píng)論 0 0