04--Spring實(shí)例化Bean的三種方式

上一小節(jié)已經(jīng)新建了Gradle模塊用來測(cè)試(如果沒有也沒關(guān)系盟步,不影響接下來的分析,可以直接在Spring的spring-beans模塊下測(cè)試即可)躏结。接下來回顧一下Spring中的一些知識(shí)點(diǎn)却盘,以便于更好的的分析源碼,本小節(jié)分析一下Spring實(shí)例化bean的三種方式媳拴。

Spring實(shí)例化Bean的方式大致上可以分為三種谷炸,構(gòu)造函數(shù)實(shí)例化,工廠方法實(shí)例化禀挫,靜態(tài)工廠方法實(shí)例化。

1.構(gòu)造函數(shù)實(shí)例化(無參構(gòu)造函數(shù)和有參構(gòu)造函數(shù))
  • bean
package com.lyc.cn.v2.day01;

/**
 1. @author: LiYanChao
 2. @create: 2018-09-27 14:23
 */
public class Dog {
    /** 姓名 **/
    private String name;

    /** 年齡 **/
    private int age;

    /**
     * 默認(rèn)構(gòu)造函數(shù)
     */
    public Dog() {
    }

    /**
     * 構(gòu)造函數(shù)
     * @param name 姓名
     * @param age  年齡
     */
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void sayHello() {
        System.out.println("大家好, 我叫" + getName() + ", 我今年" + getAge() + "歲了");
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  • xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd" profile="dev">

    <!-- ====================實(shí)例化bean的方式Begin==================== -->
    <!-- 默認(rèn)構(gòu)造實(shí)例化 -->
    <bean id="dog1" class="com.lyc.cn.v2.day01.Dog"/>

    <!-- 指定構(gòu)造器實(shí)例化 -->
    <bean id="dog2" class="com.lyc.cn.v2.day01.Dog">
        <!-- 指定構(gòu)造器參數(shù) index對(duì)應(yīng)構(gòu)造器中參數(shù)的位置 -->
        <!-- 也可以通過指定參數(shù)類型拓颓,指定參數(shù)名稱來注入屬性-->
        <constructor-arg index="0" value="小明"/>
        <constructor-arg index="1" value="3"/>
    </bean>
    <!-- ====================實(shí)例化bean的方式End==================== -->
</beans>
2.工廠方法
  • Factory
package com.lyc.cn.v2.day01;

/**
 * 工廠方法實(shí)例化
 * @author LiYanChao
 * @create: 2018-09-07 23:40
 */
public class DogFactory {

    public Dog newInstance(String name, int age) {
        return new Dog(name, age);
    }
}
  • xml
<!-- 實(shí)例工廠方法實(shí)例化 -->
<bean id="dogFactory" class="com.lyc.cn.v2.day01.DogFactory"/>
<!-- 不能指定class屬性,此時(shí)必須使用factory-bean屬性來指定工廠Bean,factory-method屬性指定實(shí)例化Bean的方法 -->
<bean id="dog4" factory-bean="dogFactory" factory-method="newInstance">
    <constructor-arg index="0" value="小明"/>
    <constructor-arg index="1" value="3"/>
</bean>
3.靜態(tài)工廠方法
  • Factory
package com.lyc.cn.v2.day01;

/**
 * 靜態(tài)工廠實(shí)例化
 * @author LiYanChao
 * @create: 2018-09-07 23:40
 */
public class DogStaticFactory {

    // 靜態(tài)工廠方法
    public static Dog newInstance(String name, int age) {
        // 返回需要的Bean實(shí)例
        return new Dog(name, age);
    }
}
  • xml
<!-- 靜態(tài)工廠方法實(shí)例化 -->
<bean id="dog3" class="com.lyc.cn.v2.day01.DogStaticFactory" factory-method="newInstance">
    <!-- 指定構(gòu)造器參數(shù) index對(duì)應(yīng)構(gòu)造器中參數(shù)的位置 -->
    <constructor-arg index="0" value="小明"/>
    <constructor-arg index="1" value="3"/>
</bean>

以上就是實(shí)例化Bean方式的Bean语婴,F(xiàn)actory和xml配置,比較簡單驶睦,而且都有注釋砰左,不一一講解了,接下來新建一個(gè)測(cè)試類场航,看一下運(yùn)行效果缠导。

4. 測(cè)試
package com.lyc.cn.v2.day01;

import com.lyc.cn.v2.day01.inner.Outer;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

/**
 * @author: LiYanChao
 * @create: 2018-09-07 23:40
 */
public class MyTest {
    private XmlBeanFactory xmlBeanFactory;

    @Before
    public void initXmlBeanFactory() {
        System.setProperty("spring.profiles.active", "dev");
        System.out.println("\n========測(cè)試方法開始=======\n");
        xmlBeanFactory = new XmlBeanFactory(new ClassPathResource("v2/day01.xml"));
    }

    @After
    public void after() {
        System.out.println("\n========測(cè)試方法結(jié)束=======\n");
    }

    @Test
    public void test1() {
        // 默認(rèn)構(gòu)造器
        System.out.println("默認(rèn)構(gòu)造器");
        Dog dog1 = xmlBeanFactory.getBean("dog1", Dog.class);
        dog1.sayHello();
    }

    @Test
    public void test2() {
        // 指定構(gòu)造器
        System.out.println("有參構(gòu)造器");
        Dog dog2 = xmlBeanFactory.getBean("dog2", Dog.class);
        dog2.sayHello();
    }

    @Test
    public void test3() {
        // 靜態(tài)工廠
        System.out.println("靜態(tài)工廠");
        Dog dog3 = xmlBeanFactory.getBean("dog3", Dog.class);
        dog3.sayHello();
    }

    @Test
    public void test4() {
        // 實(shí)例工廠
        System.out.println("實(shí)例工廠");
        Dog dog4 = xmlBeanFactory.getBean("dog4", Dog.class);
        dog4.sayHello();
    }
}
5.測(cè)試結(jié)果
========測(cè)試方法開始=======

默認(rèn)構(gòu)造器
大家好, 我叫null, 我今年0歲了

========測(cè)試方法結(jié)束=======


========測(cè)試方法開始=======

有參構(gòu)造器
大家好, 我叫小明, 我今年3歲了

========測(cè)試方法結(jié)束=======


========測(cè)試方法開始=======

靜態(tài)工廠
大家好, 我叫小明, 我今年3歲了

========測(cè)試方法結(jié)束=======


========測(cè)試方法開始=======

實(shí)例工廠
大家好, 我叫小明, 我今年3歲了

========測(cè)試方法結(jié)束=======
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市溉痢,隨后出現(xiàn)的幾起案子僻造,更是在濱河造成了極大的恐慌憋他,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件髓削,死亡現(xiàn)場(chǎng)離奇詭異竹挡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)立膛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門揪罕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宝泵,你說我怎么就攤上這事好啰。” “怎么了儿奶?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵框往,是天一觀的道長。 經(jīng)常有香客問我廓握,道長搅窿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任隙券,我火速辦了婚禮男应,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娱仔。我一直安慰自己沐飘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布牲迫。 她就那樣靜靜地躺著耐朴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盹憎。 梳的紋絲不亂的頭發(fā)上筛峭,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音陪每,去河邊找鬼影晓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛檩禾,可吹牛的內(nèi)容都是我干的挂签。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盼产,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼饵婆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起戏售,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤侨核,失蹤者是張志新(化名)和其女友劉穎草穆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芹关,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡续挟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侥衬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诗祸。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖轴总,靈堂內(nèi)的尸體忽然破棺而出直颅,到底是詐尸還是另有隱情,我是刑警寧澤怀樟,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布功偿,位于F島的核電站,受9級(jí)特大地震影響往堡,放射性物質(zhì)發(fā)生泄漏械荷。R本人自食惡果不足惜密强,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一站辉、第九天 我趴在偏房一處隱蔽的房頂上張望跛十。 院中可真熱鬧扶平,春花似錦、人聲如沸尔邓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽对湃。三九已至崖叫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拍柒,已是汗流浹背心傀。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拆讯,地道東北人剧包。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像往果,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子一铅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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