《Spring實(shí)戰(zhàn)》-第二章:Bean的裝配(1)-XML顯式裝配

慢慢來(lái)比較快,虛心學(xué)技術(shù)

前言:創(chuàng)建應(yīng)用對(duì)象之間協(xié)作關(guān)系的行為通常稱為裝配( wiring )斯撮,這也是依賴注入( DI )的本質(zhì)

Spring提供三種Bean裝配機(jī)制:

  1. 在 XML 中進(jìn)行顯式配置。
  2. 在 Java 中進(jìn)行顯式配置
  3. 隱式的 bean 發(fā)現(xiàn)機(jī)制和自動(dòng)裝配

*原文連接:https://blog.csdn.net/Laiguanfu/article/details/88046259

本文簡(jiǎn)單講解Spring中使用xml方式進(jìn)行顯式配置裝配Bean的步驟和內(nèi)容分析

使用xml進(jìn)行Bean的裝配是Spring最原始也是持續(xù)時(shí)間最長(zhǎng)的裝配方式踊东,該配置文件使用<beans>作為根節(jié)點(diǎn),配置處于應(yīng)用內(nèi)的Bean。

一呻粹、簡(jiǎn)單使用

本文使用最簡(jiǎn)單的配置,只為記錄xml顯式裝配bean的實(shí)現(xiàn)苏研,maven引用如下(其中${org.springframework.version}可替換成任意版本):

<!--spring框架引入-->
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-core</artifactId>
     <version>${org.springframework.version}</version>
</dependency>

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${org.springframework.version}</version>
</dependency>

<dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-test</artifactId>
       <version>${org.springframework.version}</version>
</dependency>

①編寫(xiě)基礎(chǔ)類(lèi)CDBean代碼

public class CDBean {

    /**
     * 定義CD名
     */
    private String title;

    /**
     * 定義CD作者
     */
    private String author;

}

②編寫(xiě)接口類(lèi)CDPlayer

public interface CDPlayer {

    /**
     * 定義方法播放CD
     *  @param
     *       
     * @return void
     *       
     * @author xxx 2019/2/27
     * @version 1.0
     **/
    void playCD();

}

③編寫(xiě)接口實(shí)現(xiàn)類(lèi)等浊,同時(shí)將CDBean作為屬性通過(guò)setter方法傳入

public class CDPlayerImpl implements CDPlayer {

    private CDBean cdBean;

    public void setCDBean(CDBean cdBean){
        this.cdBean = cdBean;
    }

    @Override
    public void playCD() {
        System.out.println("正在播放:"+cdBean.getTitle()+" by "+cdBean.getAuthor());
    }
}

④創(chuàng)建XML配置文件application.xml(命名隨意)

注:IDEA中可以選擇使用默認(rèn)的File菜單快速創(chuàng)建Spring默認(rèn)簡(jiǎn)單格式的配置文件

idea添加spring配置文件

得到簡(jiǎn)單格式的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">

</beans>

⑤使用<bean>節(jié)點(diǎn)配置CDBean并使用<peroperty>節(jié)點(diǎn)進(jìn)行屬性默認(rèn)值注入

<?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">

    <!--定義一個(gè)名為cdBean的Bean-->
    <bean name="cdBean" class="com.my.spring.bean.CDBean">
        <!--默認(rèn)值注入-->
        <property name="title" value="The World!!"/>
        <property name="author" value="Mr.D"/>
    </bean>

</beans>

⑥ 用<bean>節(jié)點(diǎn)配置CDPlayer并使用<peroperty>節(jié)點(diǎn)進(jìn)行屬性默認(rèn)值注入

<?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">

    <bean name="cdBean" class="com.my.spring.bean.CDBean">
        <property name="title" value="The World!!"/>
        <property name="author" value="Mr.D"/>
    </bean>

    <bean name="cdPlayer" class="com.my.spring.service.impl.CDPlayerImpl">
        <!--將上面配置的cdBean類(lèi)通過(guò)ref屬性注入到cdPlayer中名為cdBean的屬性中-->
        <property name="cdBean" ref="cdBean"/>
    </bean>
</beans>

⑦通過(guò)上一篇文章提及的獲取配置文件應(yīng)用上下文ClassPathXmlApplicationContext中獲取目標(biāo)bean并進(jìn)行測(cè)試

public class App 
{
    public static void main(String[] args) {
        /**
         * 從根目錄的application.xml文件中構(gòu)建應(yīng)用上下文
         */
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application.xml");

        /**
        *從應(yīng)用上下文中獲取所有bean的類(lèi)名
        */
        String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
        for (String className : beanDefinitionNames){
            System.out.println(className);
        }

        /**
         * 從應(yīng)用上下文中提取目標(biāo)實(shí)體
         */
        CDPlayer cdPlayer = applicationContext.getBean(CDPlayer.class);

        /**
         * 執(zhí)行方法進(jìn)行測(cè)試
         */
        cdPlayer.playCD();
    }
}

⑧測(cè)試結(jié)果,cdBean和cdPlayer成功裝配摹蘑,且cdBean默認(rèn)屬性注入和cdPlayer的cdBean屬性依賴注入成功

cdBean
cdPlayer
正在播放:The World!! by Mr.D

二筹燕、xml文件分析

節(jié)點(diǎn)<bean>:裝配Bean的根本性節(jié)點(diǎn)

|======屬性 class -------注明當(dāng)前裝配的Bean的class類(lèi)型

|======屬性 id -------為當(dāng)前裝配的Bean添加一個(gè)唯一性標(biāo)識(shí)

|======屬性 name-------為當(dāng)前裝配的Bean添加一個(gè)別名,可等同id

|======屬性 parent -------指定當(dāng)前裝配的Bean的父類(lèi)在xml文件中對(duì)應(yīng)的name/id

<bean id = "bean1" name = "alis1" class = "com.xxx.類(lèi)名" parean = "beanParent"></bean>

|======子節(jié)點(diǎn) <property>: 為bean注入屬性操作而服務(wù)

|===========屬性 name ------對(duì)應(yīng)于Bean實(shí)體中的屬性名稱

|===========屬性 value ------name指定屬性的默認(rèn)字面量值

|===========屬性 **ref **-------name指定屬性同樣是一個(gè)被裝配的類(lèi)衅鹿,ref的值是目標(biāo)Bean的id

<bean id = "bean2" name = "alis2" class = "com.xxx.類(lèi)名">
        <property name = "p" value = "testProperty">
        <property name = "q" ref = "bean1">
</bean>

|======子節(jié)點(diǎn) <constructor-arg>: 從bean的構(gòu)造函數(shù)中注入?yún)?shù)(以下)
|===========屬性 name ------對(duì)應(yīng)于構(gòu)造函數(shù)中的參數(shù)名稱
|===========屬性 value ------name指定參數(shù)的默認(rèn)字面量值
|===========屬性 ref -------name指定參數(shù)同樣是一個(gè)被裝配的類(lèi)撒踪,ref的值是目標(biāo)Bean的id
|===========屬性 index ------指定當(dāng)前參數(shù)在構(gòu)造函數(shù)中的下標(biāo)
|===========屬性 type ------指定目標(biāo)參數(shù)的類(lèi)型

<bean id = "bean3" name = "alis3" class = "com.xxx.類(lèi)名">
     <constructor-arg name = "param1" value = "value1"/>
     <constructor-arg index = 1 value = "value2"/>
     <constructor-arg index = 2 ref = "bean2"/>
     <constructor-arg type = "com.xxx.類(lèi)名" ref = "value2"/>
</bean>

三、屬性注入

簡(jiǎn)單示例里面的注入方式塘安,實(shí)際上使用的是bean里面的setter方法注入糠涛,要求對(duì)應(yīng)屬性在bean中必須存在setter方法,否則無(wú)法注入
使用構(gòu)造器注入

public class CDPlayerImpl implements CDPlayer {
    private CDBean cdBean;

    public CDPlayerImpl() {
        super();
    }

    public CDPlayerImpl(CDBean cdBean) {
        super();
        this.cdBean = cdBean;
    }
}

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">

    <!--定義一個(gè)名為cdBean的Bean-->
    <bean name="cdBean" class="com.my.spring.bean.CDBean">
        <!--默認(rèn)值注入-->
        <property name="title" value="The World!!"/>
        <property name="author" value="Mr.D"/>
    </bean>

    <bean name="cdPlayer" class="com.my.spring.service.impl.CDPlayerImpl">
        <!--將上面配置的cdBean類(lèi)通過(guò)ref屬性注入到cdPlayer構(gòu)造方法中名為cdBean的參數(shù)中-->
        <constructor-arg name = "cdBean" ref = "cdBean"/>
    </bean>
</beans>

注入列表參數(shù)

此處涉及到<list><set>節(jié)點(diǎn)兼犯,用于注入列表或者數(shù)組

假設(shè)CDPlayerImpl類(lèi)中有屬性cdBeans

public class CDPlayerImpl implements CDPlayer {
    private List<CDBean> cDBeans;

    public void setCDBeans(List<CDBean> cDBeans){
        this.cDBeans = cDBeans;
    }
}

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">

    <!--定義一個(gè)名為cdBean1的Bean-->
    <bean name="cdBean1" class="com.my.spring.bean.CDBean">
        <!--默認(rèn)值注入-->
        <property name="title" value="One"/>
        <property name="author" value="Mr.D"/>
    </bean>

     <!--定義一個(gè)名為cdBean2的Bean-->
    <bean name="cdBean2" class="com.my.spring.bean.CDBean">
        <!--默認(rèn)值注入-->
        <property name="title" value="Two"/>
        <property name="author" value="Mr.D"/>
    </bean>

    <bean name="cdPlayer" class="com.my.spring.service.impl.CDPlayerImpl">
        <property name="cDBeans">
            <list>
                <ref bean = "cdBean1"> 
                <ref bean = "cdBean2"> 
            </list>
        </property>
    </bean>
</beans>

注:無(wú)論類(lèi)中使用的是list還是使用set或者數(shù)組作為屬性忍捡,xml中都可以使用list或set進(jìn)行注入

四、小結(jié)

1.spring依靠xml文件進(jìn)行顯式裝配切黔,xml文件的根節(jié)點(diǎn)是<beans>,包含多個(gè)<bean>節(jié)點(diǎn)

2.xml文件中每個(gè)bean節(jié)點(diǎn)可以指定對(duì)應(yīng)組件的類(lèi)型砸脊,名稱

3.xml文件中,通過(guò)bean的property子節(jié)點(diǎn)實(shí)現(xiàn)屬性初始化或依賴注入

4.xml文件中纬霞,通過(guò)bean的constructor-arg子節(jié)點(diǎn)實(shí)現(xiàn)構(gòu)造器參數(shù)初始化或依賴注入

5.xml文件中凌埂,通過(guò)property或constructor-arg的子節(jié)點(diǎn)<list>或<set>實(shí)現(xiàn)列表的注入

6.所有通過(guò)xml顯式配置的bean,在代碼中通過(guò)上一篇文章所描述的應(yīng)用上下文實(shí)現(xiàn)ClassPathXmlApplicationContext從容器中獲取實(shí)體

參考文檔:

【1】《Spring 實(shí)戰(zhàn)(第 4 版)》·Craig Walls

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诗芜,一起剝皮案震驚了整個(gè)濱河市瞳抓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伏恐,老刑警劉巖孩哑,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異翠桦,居然都是意外死亡横蜒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丛晌,“玉大人仅炊,你說(shuō)我怎么就攤上這事∨熘耄” “怎么了抚垄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瓶竭。 經(jīng)常有香客問(wèn)我督勺,道長(zhǎng),這世上最難降的妖魔是什么斤贰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮次询,結(jié)果婚禮上荧恍,老公的妹妹穿的比我還像新娘。我一直安慰自己屯吊,他們只是感情好送巡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著盒卸,像睡著了一般骗爆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔽介,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天摘投,我揣著相機(jī)與錄音,去河邊找鬼虹蓄。 笑死犀呼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的薇组。 我是一名探鬼主播外臂,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼律胀!你這毒婦竟也來(lái)了宋光?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炭菌,失蹤者是張志新(化名)和其女友劉穎罪佳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體娃兽,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菇民,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片第练。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阔馋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出娇掏,到底是詐尸還是另有隱情呕寝,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布婴梧,位于F島的核電站下梢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏塞蹭。R本人自食惡果不足惜孽江,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望番电。 院中可真熱鬧岗屏,春花似錦、人聲如沸漱办。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)娩井。三九已至暇屋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間洞辣,已是汗流浹背咐刨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屋彪,地道東北人所宰。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像畜挥,于是被迫代替她去往敵國(guó)和親仔粥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349