1. 程式人生 > >Spring 常用引數值 List,Set,Map,Properties,集合合併的設定

Spring 常用引數值 List,Set,Map,Properties,集合合併的設定

在Spring配置檔案中,使用者不單可以將int,String等字面值注入Bean中,還可以注入集合,List的型別,以及自定義型別;

接下來,我們一起進入Spring注入引數的學習!

1.設定內部Bean

如果book Bean只被author Bean 引用,不被容器中其他Bean引用,在這種情況下我們就可以將book 以內部Bean的方式注入到Bean中。先建一個Author類,在類中增加兩個屬性,name 和 book,其中Book類是自定義的類;為了方便學習,我們在兩個屬性的set方法中各寫一條輸出語句,以便之後控制檯的檢視;

Author.class

package com.vtstar.entity;

/**
 * @ClassName Author
 * @Description TODO
 * @Author XiaoWu
 * @Date 2018/9/6 14:40
 * @Version 1.0
 **/
public class Author {

    private String name;

    private Book book = new Book();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("Author name:"+name);
        this.name = name;
    }

    public Book getBook() {
        return book;
    }

    public void setBook(Book book) {
        System.out.println("我是內部Bean建立的Book 我的名字叫:" + book.getName() + " 價格為:" + book.getPrice());
        this.book = book;
    }
}

Book.class

package com.vtstar.entity;

/**
 * @ClassName Book
 * @Description TODO
 * @Author XiaoWu
 * @Date 2018/9/6 14:40
 * @Version 1.0
 **/
public class Book {
    private String name;

    private double price;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("Book name:" + name);
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        System.out.println("Book price:" + price);
        this.price = price;
    }
}

定義內部Bean 和 宣告Java中的匿名類相似,既沒有名字,也不能被其他的Bean引用,只能在宣告Bean的時候提供例項注入。在內部Bean中即使提供了id,name,scope屬性,也會被忽略,scope預設為proptotype (非單例模式)。

     <!--內部Bean-->
    <bean id="author" class="com.vtstar.entity.Author">
        <property name="book">
            <bean class="com.vtstar.entity.Book">
                <property name="price" value="22.0"/>
                <property name="name" value="老人與海"/>
            </bean>
        </property>
    </bean>

控制檯輸出:

2.設定null值

如果你想通過Spring容器在Book中的name裡注入一個null值或者空字串,你可以通過以下的配置來獲取。

    <!--設定null值-->
    <bean id="author2" class="com.vtstar.entity.Author">
        <property name="name"><value/></property><!--注入的是空字串 -->
        <property name="name"><null/></property><!--注入的是null -->
    </bean>

<value/>列印結果:

<null/>等同於author.setName(null)。

3.級聯屬性

和Struts,Hibernate框架一樣,Spring也支援級聯屬性的操作,如果你想在定義author時直接為book的屬性提供注入值,可以採取如下配置方式:

    <!--級聯屬性-->
    <bean id="author3" class="com.vtstar.entity.Author">
        <property name="book.name" value="三體"/>
        <property name="book.price" value="33.9"/>
    </bean>

值得一提的是在Author類中一定要例項化book類,不能只宣告Book類,如果不例項化Book類,Spring容器不會允許你進行級聯操作,就會丟擲NullValueInNestedPathException異常;

所以為了程式能夠正常啟動,還是按照Spring的要求來辦吧!


//    private Book book; 錯誤的寫法
    private Book book = new Book();//正確的寫法

控制檯結果:

4.集合型別

接下來我們來注入list set map properties常用的資料結構型別;

新建一個ListType類,相關的集合屬性已經在這個類中建好;

package com.vtstar.entity;

import java.util.*;

/**
 * @ClassName ListType
 * @Description java.util包下的集合型別是最常用的資料結構型別,其中包括 List Set Map Porperties
 * @Author XiaoWu
 * @Date 2018/9/6 15:06
 * @Version 1.0
 **/
public class ListType {


    //list集合
    private List favorites = new ArrayList();

    public List getFavorites() {
        return favorites;
    }

    public void setFavorites(List favorites) {
        this.favorites = favorites;
        for (Object list :favorites) {
            System.out.println("list [] :"+list.toString());
        }
    }

    //set集合
    private Set favorites2 = new HashSet();

    public Set getFavorites2() {
        return favorites2;
    }

    public void setFavorites2(Set favorites2) {
        this.favorites2 = favorites2;
        for (Object set: favorites2 ) {
            System.out.println("set [] :"+set.toString());
        }
    }

    //map集合
    private Map jobs = new HashMap();

    public Map getJobs() {
        return jobs;
    }

    public void setJobs(Map jobs) {
        this.jobs = jobs;
        for (Object job: jobs.keySet()) {
            System.out.println("map key == " + job + " value == " + jobs.get(job).toString());
        }
    }

    //properties集合
    private Properties mails = new Properties();

    public Properties getMails() {
        return mails;
    }

    public void setMails(Properties mails) {
        this.mails = mails;
        for (String prop:mails.stringPropertyNames()) {
            System.out.println("properties key == " + prop + " value == " + mails.getProperty(prop));
        }
    }

    //強型別集合
    private Map<String,Integer> jobTime = new HashMap<String, Integer>();

    public Map<String, Integer> getJobTime() {
        return jobTime;
    }

    public void setJobTime(Map<String, Integer> jobTime) {
        this.jobTime = jobTime;
        for (Map.Entry<String,Integer> job: jobTime.entrySet()) {
            System.out.println("map<String,Integer> key == " + job.getKey() + " value == " + job.getValue());
        }
    }

    //集合合併
    private Set favorites3 = new HashSet();

    public Set getFavorites3() {
        return favorites3;
    }

    public void setFavorites3(Set favorites3) {
        this.favorites3 = favorites3;
        for (Object set: favorites3 ) {
            System.out.println("merge set [] :"+set.toString());
        }
    }
}

1.List

Spring中配置List型別的favorites屬性。

    <!--1.list-->
    <bean id="listType" class="com.vtstar.entity.ListType">
        <property name="favorites">
            <list>
                <value>吃飯</value>
                <value>睡覺</value>
                <value>打豆豆</value>
            </list>
        </property>
    </bean>

List屬性既可以通過<value/>注入字串,也可以通過<ref/>注入容器中其他的Bean。

控制檯輸出結果:

2.Set

    <!--2.set-->
    <bean id="setType" class="com.vtstar.entity.ListType">
        <property name="favorites2">
            <set>
                <value>抽菸</value>
                <value>喝酒</value>
                <value>燙頭</value>
            </set>
        </property>
    </bean>

控制檯輸出結果:

3.Map

    <bean id="boss" class="com.vtstar.entity.Boss">
        <constructor-arg value="Tom"/>
        <constructor-arg ref="car1"/>
        <constructor-arg value="20"/>
    </bean>
    <bean id="car" class="com.vtstar.entity.Car">
        <property name="brand" value="保時捷 k3TIM"/>
        <property name="maxSpeed" value="100"/>
        <property name="price" value="30.1"/>
    </bean>    
    <!--3.map-->
    <bean id="mapType" class="com.vtstar.entity.ListType">
        <property name="jobs">
            <map>
                <entry>
                    <key><value>研發1</value></key>
                    <value>Java開發工程師</value>
                </entry>
                <entry>
                    <key><value>研發2</value></key>
                    <value>Php開發工程師</value>
                </entry>
                <entry>
                    <key><value>研發3</value></key>
                    <value>Ruby開發工程師</value>
                </entry>
                <!--如果map的key和value都是bean-->
                <entry>
                    <key><ref bean="boss"/></key>
                    <ref bean="car"/>
                </entry>
            </map>
        </property>
    </bean>

map屬性中的<entry/>表示Map中的一個元素,如果某個元素的鍵和值都是物件,則可以參考文中的最後一個entry;

控制檯輸出結果:

4.Properties

properties型別可以看做是Map型別的特例。map元素中的鍵和值可以是任何型別的物件,而properties屬性的鍵和值都只能是字串。

    <!--4.properties-->
    <bean id="propType" class="com.vtstar.entity.ListType">
        <property name="mails">
            <props>
                <prop key="tomMail">[email protected]</prop>
                <prop key="jamesMail">[email protected]</prop>
            </props>
        </property>
    </bean>

控制檯列印結果:

5.強型別集合

    <!--強型別集合-->
    <bean id="bigMapType" class="com.vtstar.entity.ListType">
        <property name="jobTime">
            <map>
                <entry>
                    <key><value>立春</value></key>
                    <value>119</value>
                </entry>
                <entry>
                    <key><value>立夏</value></key>
                    <value>320</value>
                </entry>
                <entry>
                    <key><value>立秋</value></key>
                    <value>626</value>
                </entry>
                <entry>
                    <key><value>立冬</value></key>
                    <value>930</value>
                </entry>
            </map>
        </property>
    </bean>

強型別集合在Spring中的配置和非強型別集合相同,但是Spring在注入強型別集合時會判斷元素的型別,將設定值轉換為對應的資料型別,如key在元素中的型別是String,value在元素中的型別是Integer。

控制檯輸出結果:

6.集合合併

Spring支援集合合併的功能,允許子Bean繼承父Bean的同名屬性集合元素,並將子Bean中配置的集合屬性值和父Bean中配置的集合屬性值合併起來成為最終Bean的屬性值。就像兩個A,B水果籃子,A籃子中有香蕉,蘋果;B籃子中有檸檬,菠蘿蜜;這時把A籃子中的成員放置到一個B籃子裡面,就組成一個最終的水果籃子,但是前提必須都是水果。
 

    <!--合併集合-->
    <bean id="parentType" abstract="true" class="com.vtstar.entity.ListType">
        <property name="favorites3">
            <set>
                <value>Java</value>
                <value>.Net</value>
                <value>Php</value>
            </set>
        </property>
    </bean>
    <bean id="childType" parent="parentType">
        <property name="favorites3">
            <set merge="true">
                <value>Html</value>
                <value>Javascript</value>
                <value>jQuery</value>
            </set>
        </property>
    </bean>

merge="true"屬性指示子Bean和父Bean中的同名屬性值進行合併,如果為false就不會進行合併;

控制檯輸出: