Spring高級應用之注入各種集合

    先定義一個測試類,因爲本文將要介紹注入各類集合時如何配置,故這個類包含各類集合,類名和屬性名很差取,沒有特殊含義:java

public class Test {
    private List<String> listTest;
    private Map<String, Object> mapTest;
    private Set setTest;
    private String[] arrayTest;
    private Properties propertiesTest;
    //下面是各個屬性的setter,此處省略
    //......
}

    Test類中,分別定義了List,Map,Set,Array等5種集合類型的屬性,下面在Spring配置文件中,分別爲這些類型的屬性注入值:web

<bean id="test" class="com.abc.Test">
    <!-- List類型的屬性 -->
    <property name="listTest">
        <!-- 爲list類型的屬性注入值時,使用<list>元素 -->
        <list>
            <!-- 只要類型知足,每一個<value>,<ref>,<bean>均可以配置一個list的元素 -->
            <value>ListA</value>
            <value>ListB</value>
            <value>ListC</value>
        </list>
    </property>
    
    <!-- Map類型的屬性 -->
    <property name="mapTest">
        <!-- 爲map類型的屬性注入值時,使用<map>元素 -->
        <map>
            <!-- 每個<entry>都爲<map>配置一個K-V對,一樣, -->
            <entry key="key1" value="value1" />
            <!-- 下面這個value指向了在此Spring文件中定義的另外一個叫object的Bean -->
            <entry key="key2" value-ref="object" />
        </map>
    </property>
    
    <!-- Set類型的屬性 -->
    <property name="setTest">
        <!-- 爲set類型的屬性注入值時,使用<set>元素 -->
        <set>
            <!-- 只要類型知足,每一個<value>,<ref>,<bean>均可以配置一個list的元素 -->
            <value>SetA</value>
            <!-- 下面是一個嵌套Bean的定義。關於什麼是嵌套Bean,請看:http://my.oschina.net/itblog/blog/204378 -->
            <bean class="com.abc.OtherBean1" />
            <!-- 下面引用了此Spring文件中定義的另外一個Bean -->
            <ref local="com.abc.OtherBean2" />
        </set>
    </property>
    
    <!-- Properties類型的屬性 -->
    <property name="propertiesTest">
        <props>
            <!-- 每一個<prop>元素指定一個屬性項,其中key指定屬性名 -->
            <prop key="prop1">value1</prop>
            <prop key="prop2">value2</prop>
        </props>
    </property>
    
    <!-- 數組類型的屬性 -->
    <property name="arrayTest">
        <!-- 爲數組類型的屬性注入值時,使用<list>元素 -->
        <list>
            <!-- 只要類型知足,每一個<value>,<ref>,<bean>均可以配置一個list的元素 -->
            <value>Array1</value>
            <bean class="com.abc.OtherBean1" />
            <ref local="com.abc.OtherBean2" />
        </list>
    </property>
</bean>

    因爲集合元素有能夠是基本類型值、引用容器中其餘Bean、嵌套Bean或集合屬性等,所以<list>、<set>、和<key>元素又能夠接受以下的子元素:數組

  • value:指定集合元素是基本數據類型值或字符串類型值測試

  • ref:指定集合元素是容器中另外一個Bean實例google

  • bean:指定集合元素是一個嵌套Beanspa

  • list、set、map及props:指定集合元素值又是集合.net

    <props>元素適用於配置Properties類型的屬性,Properties類型時一種特殊的類型,其key和value都只能是字符串,故Spring配置Properties類型的屬性都比較簡單:每一個屬性項只要分別給出屬性名和屬性值就足夠了。
code

    當使用<map>元素配置Map類型屬性時稍顯複雜,由於Map類型的元素由多個<entry>組成,每一個<entry>又須要配置key和value兩個屬性。其中<entry>屬性支持如下幾個屬性:xml

  • key:當key是基本類型或字符串時使用blog

  • key-ref:當key類型是容器中定義的另外一個Bean時使用

  • value:當value是基本類型或字符串時使用

  • value-ref:當value是容器中定義的另外一個Bean時使用

    Spring還提供了一個簡化語法來支持Properties形參的setter方法,例如咱們可使用以下配置片斷來配置Properties類型的屬性:

<property name="propertiesTest">
    <value>
        key1=value1
        key2=value2
    </value>
</property>

    雖然這種配置方式更簡單,可是它也有一個缺點:屬性名、屬性值都只能是英文或數字,不能包含中文字符

    從Spring2開始,Spring IoC容器支持集合的合併:子Bean中的集合屬性能夠從其父Bean的集合屬性繼承而來,同時,子Bean中的屬性會覆蓋父Bean中屬性名相同的值。也就是說,子Bean的集合屬性的最終值是父Bean、子Bean合併後的最終結果,下面是一個示例:

<!-- 將parent類型定義成抽象類 -->
<bean id="parent" abstract="true" class="com.abc.Parent">
    <!-- 定義Properties類型的集合屬性 -->
    <property name="websites">
        <props>
            <prop key="baidu">www.baidu.com</props>
            <prop key="google">www.google.com.hk</prop>
        <props>
    </property>
</bean>
<bean id="child" parent="parent">
    <property name="websites">
        <!-- 注意,這裏子Bean在集合元素上加了屬性"merge=true" -->
        <props merge="true">
            <prop key="google">www.google.com</prop>
            <prop key="tencent">www.qq.com</prop>
        <props>
    </property>    
</bean>

    經過上面的配置後,child中的屬性將變爲:

baidu=www.baidu.com
google=www.google.com
tencent=www.qq.com
相關文章
相關標籤/搜索