Spring筆記(三):通過工廠方法配置bean

之前筆記一實踐的是全類名(反射)的方式進行bean的配置父丰,現(xiàn)在我們實踐使用工廠的方法進行bean的配置。
在使用工廠方法配置bean是有兩種方式:靜態(tài)工廠方法和實例工廠方法掘宪。

  • 靜態(tài)工廠方法
    也就是通過工廠類直接調(diào)用獲取實例的方法去獲取bean的實例蛾扇,那么工廠類是如何實現(xiàn)bean的實例和初始化呢攘烛,我們在創(chuàng)建工廠類是,可以在類的靜態(tài)代碼塊中進行bean的實例加初始化镀首,并提供獲取bean的方法坟漱;具體代碼實現(xiàn)如下:
    創(chuàng)建Car類:
public class Car {
    private String brand;//品牌
    private double price;//價錢
    public Car() {
        System.out.println("constructor()......");
    }
    public Car(String brand, double price) {
        this.brand = brand;
        this.price = price;
    }
    public void init() {
        System.out.println("init()......");
    }

    public void destory() {
        System.out.println("destory()......");
    }
    public String getBrand() {
        return brand;
    }
   public void setBrand(String brand) {
        System.out.println("setBrand()......");
        this.brand = brand;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    @Override
    public String toString() {
        return "Car{" +
                "brand='" + brand + '\'' +
                ", price=" + price +
                '}';
    }
}

靜態(tài)工廠代碼:

/**
 * 工廠靜態(tài)方法配置bean
 */
public class StaticCarFactory {
    private static Map<String, Car> cars=null;
    //初始化對象
    static {
        cars=new HashMap<>();
        cars.put("Audi",new Car("Audi",30000));
        cars.put("Ford",new Car("Ford",20000));
    }
    //獲取bean實例的方法
    public static Car getCar(String bread){
        return cars.get(bread);
    }
}

在xml配置文件中進行靜態(tài)工廠的配置

  <!--靜態(tài)方法實現(xiàn)bean的配置-->
    <!--factory-method指向靜態(tài)工廠方法的名稱-->
    <!--constructor-arg 涉及到獲取實例方法傳參的問題,設(shè)置方法的形參-->
    <bean id="staticfactory" class="com.example.demo.factory.StaticCarFactory" factory-method="getCar">
        <constructor-arg value="Audi"></constructor-arg>
    </bean>

根據(jù)配置文件可以看出通過靜態(tài)工廠實例去調(diào)用工廠方法去獲取bean的實例對象更哄,具體配置涉及到的屬性如下:

  1. id 定義靜態(tài)工廠的名稱
  2. class 靜態(tài)工廠所對應(yīng)的全路徑
  3. factory-method 靜態(tài)工廠獲取bean實例的方法
  4. constructor-arg 設(shè)置調(diào)用靜態(tài)工廠獲取bean方法是需要用到的參數(shù)

測試配置:

public class FactoryMain {

    public static void main(String[] args){
        ApplicationContext ctx=new ClassPathXmlApplicationContext("bean-factory.xml");
        //靜態(tài)工廠配置
        Car staticfactoryCar= (Car) ctx.getBean("staticfactory");
        System.out.println(staticfactoryCar);
    }
}

運行代碼結(jié)果:

Car{brand='Audi', price=30000.0}

  • 實例工廠方法
    實例工廠
/**
 * 實例工廠配置bean
 */
public class InstanceCarFactory {
    private Map<String, Car> cars = null;

    //通過無參構(gòu)造方法初始化
    public InstanceCarFactory() {
        cars = new HashMap<>();
        cars.put("Audi", new Car("Audi", 30000));
        cars.put("Ford", new Car("Ford", 20000));
    }
    //獲取bean的方法
    public Car getCar(String bread) {
        return cars.get(bread);
    }
}

xml配置文件

 <!--配置工廠實例-->
    <bean id="instancefactory" class="com.example.demo.factory.InstanceCarFactory">
    </bean>
    <!--factory-bean 指向?qū)嵗S方法的bean-->
    <!--factory-method指向是實例工廠方法的名稱-->
    <bean id="carinstance"  factory-bean="instancefactory" factory-method="getCar">
        <constructor-arg value="Audi"></constructor-arg>
    </bean>

涉及到的屬性和靜態(tài)配置的都一樣芋齿,唯一區(qū)別就是actory-bean屬性,實例工廠配置也就是先獲取實例工廠的對象實例竖瘾,這是在獲取實例工廠是調(diào)用了InstanceCarFactory()構(gòu)造方法沟突,在構(gòu)造方法中初始化了Cars,與此同時可以調(diào)用實例工廠方法去獲取配置bean的具體實例信息捕传。
測試代碼:

 public static void main(String[] args){
        ApplicationContext ctx=new ClassPathXmlApplicationContext("bean-factory.xml");
        //實例工廠配置
        Car instanceCar= (Car) ctx.getBean("carinstance");
        System.out.println(instanceCar);
    }

測試結(jié)果:

Car{brand='Audi', price=30000.0}

總結(jié):對于工廠配置bean的不論是針對靜態(tài)的方式還是實例的方式惠拭,都是在工廠中將bean實例化然后放置在ioc容器中,通過工廠獲取實例的方法去獲扔孤邸职辅!只是在實例bean的方式上是有所差異的!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末聂示,一起剝皮案震驚了整個濱河市域携,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鱼喉,老刑警劉巖秀鞭,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扛禽,居然都是意外死亡锋边,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門编曼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豆巨,“玉大人,你說我怎么就攤上這事掐场⊥樱” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵熊户,是天一觀的道長萍膛。 經(jīng)常有香客問我,道長嚷堡,這世上最難降的妖魔是什么卦羡? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上绿饵,老公的妹妹穿的比我還像新娘。我一直安慰自己瓶颠,他們只是感情好拟赊,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粹淋,像睡著了一般吸祟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桃移,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天屋匕,我揣著相機與錄音,去河邊找鬼借杰。 笑死过吻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蔗衡。 我是一名探鬼主播纤虽,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绞惦!你這毒婦竟也來了逼纸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤济蝉,失蹤者是張志新(化名)和其女友劉穎杰刽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體王滤,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡贺嫂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了淑仆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涝婉。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蔗怠,靈堂內(nèi)的尸體忽然破棺而出墩弯,到底是詐尸還是另有隱情,我是刑警寧澤寞射,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布渔工,位于F島的核電站,受9級特大地震影響桥温,放射性物質(zhì)發(fā)生泄漏引矩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旺韭。 院中可真熱鬧氛谜,春花似錦、人聲如沸区端。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽织盼。三九已至杨何,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沥邻,已是汗流浹背危虱。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唐全,地道東北人埃跷。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像芦瘾,于是被迫代替她去往敵國和親捌蚊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

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