Spring中的beanFactory和FactoryBean

首先秒紧,BeanFactory绢陌,FactoryBean都是Spring中的接口。

  • BeanFactory顧名思義熔恢,是用來(lái)管理脐湾,配置BeanFactory
  • FactoryBean顧名思義绩聘,首先是一個(gè)Bean沥割,為什么叫FactoryBean耗啦,因?yàn)樗怯?code>Spring管理的凿菩,一個(gè)產(chǎn)生BeanBean,調(diào)用它真正返回的Bean不是factoryBean的實(shí)例帜讲,而是返回實(shí)現(xiàn)該接口的getObject()中返回的Bean衅谷,如果要返回該FactoryBean實(shí)例,需要在調(diào)用的位置加上&號(hào)似将。

首先看一下接口:

public interface FactoryBean<T> {
    //通過(guò)Spring容器獲取的Bean實(shí)質(zhì)是getObject()方法返回的對(duì)象T
    T getObject() throws Exception;
    //返回類(lèi)型
    Class<?> getObjectType();
    //是否單例
    boolean isSingleton();
}

舉個(gè)例子:

  • 首先定義一個(gè)Bean:
package com.github.jettyrun.springinterface.demo.bean;

/**
 * Created by jetty on 18/1/31.
 */
public class Car {

    private String name;

    private String color;

    private String weight;

    public void setName(String name) {
        this.name = name;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public void setWeight(String weight) {
        this.weight = weight;
    }
}
  • 實(shí)現(xiàn)兩種不同的FactoryBean获黔,一種單例(Singleton)蚀苛,一種多例(protoType)
package com.github.jettyrun.springinterface.demo.factorybean;

import com.github.jettyrun.springinterface.demo.bean.Car;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;

/**
 * Created by jetty on 18/1/31.
 */

@Component("protoTypeCarFactoryBean")
public class ProtoTypeCarFactoryBean implements FactoryBean<Car>{

    public Car getObject() throws Exception {
        return new Car();
    }

    public Class<?> getObjectType() {
        return Car.class;
    }

    public boolean isSingleton() {
        return false;
    }
}
package com.github.jettyrun.springinterface.demo.factorybean;

import com.github.jettyrun.springinterface.demo.bean.Car;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;

/**
 * Created by jetty on 18/1/31.
 */
@Component("singletonCarFactoryBean")
public class SingletonCarFactoryBean implements FactoryBean<Car>{

    private Car carProxy=new Car();

    public Car getObject() throws Exception {
        return carProxy;
    }

    public Class<?> getObjectType() {
        return null;
    }

    public boolean isSingleton() {
        return true;
    }
}
  • main方法運(yùn)行測(cè)試
package com.github.jettyrun.springinterface.demo.factorybean;

import com.github.jettyrun.springinterface.demo.bean.Car;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by jetty on 18/1/31.
 */
public class Main {

    public static void main(String[] args) {
        ApplicationContext beans=new ClassPathXmlApplicationContext("classpath:application-usertag.xml");
        Car protoTypeCar1= (Car)beans.getBean("protoTypeCarFactoryBean");
        Car protoTypeCar2= (Car)beans.getBean("protoTypeCarFactoryBean");
        System.out.println(""+(protoTypeCar1==protoTypeCar2)+" "+protoTypeCar1+" "+protoTypeCar2);
        Car singletonCar1= (Car)beans.getBean("singletonCarFactoryBean");
        Car singletonCar2= (Car)beans.getBean("singletonCarFactoryBean");
        System.out.println(""+(singletonCar1==singletonCar2)+" "+singletonCar1+" "+singletonCar2);

        SingletonCarFactoryBean factoryBean1=(SingletonCarFactoryBean)beans.getBean("&singletonCarFactoryBean");
        SingletonCarFactoryBean factoryBean2=(SingletonCarFactoryBean)beans.getBean("&singletonCarFactoryBean");
        System.out.println(""+(factoryBean1==factoryBean2)+" "+factoryBean1+" "+factoryBean2);

    }
}
  • 運(yùn)行結(jié)果:
false com.github.jettyrun.springinterface.demo.bean.Car@710f4d59 com.github.jettyrun.springinterface.demo.bean.Car@239f480c
true com.github.jettyrun.springinterface.demo.bean.Car@2e331e19 com.github.jettyrun.springinterface.demo.bean.Car@2e331e19
true com.github.jettyrun.springinterface.demo.factorybean.SingletonCarFactoryBean@1dfd1301 com.github.jettyrun.springinterface.demo.factorybean.SingletonCarFactoryBean@1dfd1301

我們能看到,通過(guò)Spring容器獲取protoTypeCarFactoryBean玷氏,singletonCarFactoryBean對(duì)象堵未,實(shí)質(zhì)返回的是該對(duì)象調(diào)用的getObject()方法返回的對(duì)象,如果要獲取FactoryBean的真正類(lèi)型盏触,則需要在beanId前加上&符號(hào)渗蟹。

BeanFactory到底又是如何使用的。

我們將上面的main方法做一下改變赞辩,將ApplicationContext改為BeanFactory雌芽。如下:

public static void main(String[] args){
        Resource resource = new FileSystemResource("src/main/resources/application-usertag.xml");
        BeanFactory factory = new XmlBeanFactory(resource);
        Car protoTypeCar1= (Car)factory.getBean("protoTypeCarFactoryBean");
        Car protoTypeCar2= (Car)factory.getBean("protoTypeCarFactoryBean");
        System.out.println(""+(protoTypeCar1==protoTypeCar2)+" "+protoTypeCar1+" "+protoTypeCar2);
        Car singletonCar1= (Car)factory.getBean("singletonCarFactoryBean");
        Car singletonCar2= (Car)factory.getBean("singletonCarFactoryBean");
        System.out.println(""+(singletonCar1==singletonCar2)+" "+singletonCar1+" "+singletonCar2);

        SingletonCarFactoryBean factoryBean1=(SingletonCarFactoryBean)factory.getBean("&singletonCarFactoryBean");
        SingletonCarFactoryBean factoryBean2=(SingletonCarFactoryBean)factory.getBean("&singletonCarFactoryBean");
        System.out.println(""+(factoryBean1==factoryBean2)+" "+factoryBean1+" "+factoryBean2);
    }

運(yùn)行結(jié)果和上面的運(yùn)行結(jié)果完全一樣。
這就表示著在Spring中辨嗽,所有的bean都是被beanFactory管理世落,需要獲取bean的時(shí)候,實(shí)質(zhì)是去beanFactory中獲取糟需。applicationContext本身是實(shí)現(xiàn)BeanFactory接口的實(shí)現(xiàn)屉佳。
如下:

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
        MessageSource, ApplicationEventPublisher, ResourcePatternResolver {

HierarchicalBeanFactory本身是繼承BeanFactory接口的。
也就是上面所說(shuō)的篮灼,FactoryBean是一個(gè)為了產(chǎn)生BeanBean忘古,而BeanFactory是用來(lái)管理河闰,產(chǎn)生Bean的一個(gè)Factory睬捶。
代碼地址:https://gitee.com/shxz130/SpringInterfaceDemo/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市搞坝,隨后出現(xiàn)的幾起案子娘荡,更是在濱河造成了極大的恐慌干旁,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炮沐,死亡現(xiàn)場(chǎng)離奇詭異争群,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)大年,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)换薄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人翔试,你說(shuō)我怎么就攤上這事轻要。” “怎么了垦缅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵冲泥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)凡恍,這世上最難降的妖魔是什么志秃? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮嚼酝,結(jié)果婚禮上浮还,老公的妹妹穿的比我還像新娘。我一直安慰自己闽巩,他們只是感情好碑定,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著又官,像睡著了一般延刘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上六敬,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天碘赖,我揣著相機(jī)與錄音,去河邊找鬼外构。 笑死普泡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的审编。 我是一名探鬼主播撼班,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼垒酬!你這毒婦竟也來(lái)了砰嘁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤勘究,失蹤者是張志新(化名)和其女友劉穎矮湘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體口糕,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缅阳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了景描。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片十办。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖超棺,靈堂內(nèi)的尸體忽然破棺而出向族,到底是詐尸還是另有隱情,我是刑警寧澤说搅,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布炸枣,位于F島的核電站虏等,受9級(jí)特大地震影響弄唧,放射性物質(zhì)發(fā)生泄漏适肠。R本人自食惡果不足惜候引,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一侯养、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澄干,春花似錦逛揩、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至从媚,卻和暖如春逞泄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拜效。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工喷众, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人紧憾。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓到千,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親赴穗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子憔四,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)般眉,斷路器加矛,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • 文章作者:Tyan博客:noahsnail.com | CSDN | 簡(jiǎn)書(shū) 3.8 Container Exten...
    SnailTyan閱讀 1,231評(píng)論 0 6
  • 什么是Spring Spring是一個(gè)開(kāi)源的Java EE開(kāi)發(fā)框架。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,445評(píng)論 1 133
  • 03生活習(xí)慣 孩子除了要有以上良好的習(xí)慣外煤篙,更要有以下這些技能斟览,你家孩子都有嗎? 態(tài)度篇 如果說(shuō)人生是一章樂(lè)曲辑奈,那...
    每個(gè)人的孟母堂閱讀 219評(píng)論 0 1
  • llvm:low level virtual machine
    ww4u閱讀 158評(píng)論 0 0