系統學習Spring之Spring in action(三)


每日一叨:

  今天加班,本來想多留點時間放在博客上的,計划永遠敢不上變化快,所有只能在變化中盡自己最大的努力去做原本計划過的事,哪怕只記錄了一個知識點,那也是一種積累,一般情況下,理性要大於感性,否則你的一個念頭可以破壞整個計划.

文章導讀:

    1.InnerBean(內部bean)

    2.用Spring的命名空間p去實現bean中properties標簽的功能

    3.裝配Collection

    4.裝配null

 

知識點:

    經常玩游戲的人應該知道什么叫專署這個概念吧,就算你不經常玩游戲,我想從字面也可以理解這個詞.還是用我自己的語言解釋下吧,

專署:最簡單的解釋就是指一件事物只屬於另一件事物(想想一對一關系應該可以理解).通過下一個知識點,更形象的講解專署.

 

 1.InnerBean(內部bean)

     回顧上一篇文章,我們可以通過properties標簽中的ref屬性注入一個對象類型,但是這個ref對象的bean是共享給Spring Container中的

其它所有bean.每個bean都可以注入這個bean.怎么樣能讓一個bean只專署於另外一個bean?Spring給我們提供了一個解決方案是使用InnerBean來解決

專署問題.請下如下事例:

Spring提供了兩種InnerBean,一種是properties標簽下的InnerBean,另一種是constructor-arg標簽下的InnerBean.

1)Properties InnerBean

創建一個手機類:

public class Phone {
    //手機主人
    private String master;
    
    //手機品牌
    private String brand;
    
    //無參構造方法
    public Phone() {
    }
    
    //有參構造方法
    public Phone(String master, String brand) {
        this.master = master;
        this.brand = brand;
    }
    
    public String getMaster() {
        return master;
    }
    
    public void setMaster(String master) {
        this.master = master;
    }
    
    public String getBrand() {
        return brand;
    }
    
    public void setBrand(String brand) {
        this.brand = brand;
    }
    
}

然后創建一個手機的專署類,

public class LiuShuai {
    //LiuShuai的專署電話
    private Phone phone;

    //無參構造方法
    public LiuShuai() {}

    //有參構造方法
    public LiuShuai(Phone phone) {
     this.phone = phone; }
public Phone getPhone() { return phone; } public void setPhone(Phone phone) { this.phone = phone; } public void find(){ System.out.println(this.phone.getMaster() + " 主人,您的專署 " + this.phone.getBrand() + " 手機在這呢."); } }

配置Spring configuration

    <bean id="liushuai" class="com.ricky.zero.pojo.LiuShuai">
        <property name="phone">
            <bean class="com.ricky.zero.pojo.Phone">
                <property name="master" value="劉帥"></property>
                <property name="brand" value="諾基亞"></property>
            </bean>
        </property>
    </bean>


把以前properties的ref屬性和ref的bean先清除,然后寫成上圖格式,我想你們應該能看得懂,properties下bean替換了ref屬性和ref的bean,記着InnerBean

沒有id或者name屬性.

配置完成后開始測試,

        ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
        LiuShuai liushuai  = (LiuShuai)ctx.getBean("liushuai");
        liushuai.find();

測試運行后得到結果如下:

劉帥 主人,您的專署 諾基亞 手機在這呢.

得到這個結果后,說明成功的完成了properties的InnerBean的測試.由於InnerBean的生命周期只是在id="liushuai"的bean中,所有其它的bean無法共享注入.

 

2)constructor-arg  InnerBean

根據上面的准備,只需要修改Spring Configuration的配置文件就可以實現constructor-arg的innerBean

    <bean id="liushuai" class="com.ricky.zero.pojo.LiuShuai">
        <constructor-arg>
            <bean class="com.ricky.zero.pojo.Phone">
                <property name="master" value="劉帥"></property>
                <property name="brand" value="諾基亞"></property>
            </bean>
        </constructor-arg>
    </bean>

修改完成后,直接運行測試.

測試結果:

劉帥 主人,您的專署 諾基亞 手機在這呢.

測試成功,Inner Bean到這里就結束了.

 

 

2.用Spring的命名空間p去實現bean中properties標簽的功能

 

  上一篇文章中描述如何使用Properties,但是每次使用properties總是要打一堆的尖括號,不方便.Spring給提供了一個使用命名空間p去簡化properties

的實現.直接看事例.

注意,在使用命名空間p之前,要在beans標簽中添加 xmlns:p="http://www.springframework.org/schema/p"

這是properties的用法

    <bean id="war3" class="com.ricky.zero.pojo.War3"></bean>
    <bean id="dota" class="com.ricky.zero.pojo.Dota">
        <property name="author" value="冰蛙"></property>
        <property name="war3" ref="war3"></property>
    </bean>

這是使用命名空間p后的代碼

一定要記着要在beans標簽中添加 xmlns:p="http://www.springframework.org/schema/p"  如果少加了這段話則會拋出

與元素類型 "bean" 相關聯的屬性 "p:author" 的前綴 "p" 未綁定

    <bean id="war3" class="com.ricky.zero.pojo.War3"></bean>
    <bean id="dota" class="com.ricky.zero.pojo.Dota" p:author="冰蛙" p:war3-ref="war3" />

兩次配置后運行的測試結果都是:

大家好,我們名字叫Dota,來自 冰蛙 之手
大家好,我的名字叫魔獸爭霸,相信你們很多人都已經認識我了.

3.裝配Collection     

  Spring提供了通過properties裝配四種集合類型.四種集合類型分別是List、Set、Map、Props.

直接上事例:

首先建一個游戲接口,方便下面使用.

public interface Game {
    //獲取游戲名稱
    public void getGameName();
}

建立實現接口的3個游戲類.

public class CYHX implements Game {
    //穿越火線
    @Override
    public void getGameName() {
        // TODO Auto-generated method stub
        System.out.println("大家好,我的名字叫穿越火線.");
    }

}
public class MSSJ implements Game {
    //魔獸世界
    @Override
    public void getGameName() {
        // TODO Auto-generated method stub
        System.out.println("大家好,我的名字叫魔獸世界.");
    }
}
public class YXLM implements Game {
    //英雄聯盟
    @Override
    public void getGameName() {
        // TODO Auto-generated method stub
        System.out.println("大家好,我的名字叫英雄聯盟.");
    }
}

建立一個集合類:

public class GameCollection {
    //游戲集合
    private Collection<Game> games;
    
    public Collection<Game> getGames() {
        return games;
    }

    public void setGames(Collection<Game> games) {
        this.games = games;
    }

    public void launch(){
        for(Game game:games){
            game.getGameName();
        }
    }

 

配置Spring container:

    <bean id="mssj" class="com.ricky.zero.pojo.MSSJ"></bean>
    <bean id="cyhx" class="com.ricky.zero.pojo.CYHX"></bean>
    <bean id="yxlm" class="com.ricky.zero.pojo.YXLM"></bean>
    <bean id="gameCollection" class="com.ricky.zero.pojo.GameCollection">
        <property name="games">
            <list>
                <ref bean="mssj" />
                <ref bean="cyhx" />
                <ref bean="yxlm" />
                <ref bean="yxlm" />
            </list>
        </property>
    </bean>

前面3個bean應該很熟悉,最后一個bean中的properties實例化的不是在一個基本類型,或者是一個實現bean,而變成了一個集體類型.list標簽表明該集合是list

類型.list集合中的元素通過ref標簽取得已經存在的bean,在list集合中,存放的元素是可以重復的.

下面進行測試:

        ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
        GameCollection gameCollection  = (GameCollection)ctx.getBean("gameCollection");
        gameCollection.launch();

測試結果:

大家好,我的名字叫魔獸世界.
大家好,我的名字叫穿越火線.
大家好,我的名字叫英雄聯盟.
大家好,我的名字叫英雄聯盟.

測試List集合注入成功.

Set集合與List集合用法一樣,下面我們只需要把Spring Configuration中list標簽替換成set標簽即可.

    <bean id="mssj" class="com.ricky.zero.pojo.MSSJ"></bean>
    <bean id="cyhx" class="com.ricky.zero.pojo.CYHX"></bean>
    <bean id="yxlm" class="com.ricky.zero.pojo.YXLM"></bean>
    <bean id="gameCollection" class="com.ricky.zero.pojo.GameCollection">
        <property name="games">
            <set>
                <ref bean="mssj" />
                <ref bean="cyhx" />
                <ref bean="yxlm" />
                <ref bean="yxlm" />
            </set>
        </property>
    </bean>

測試運行.運行結果如下:

大家好,我的名字叫魔獸世界.
大家好,我的名字叫穿越火線.
大家好,我的名字叫英雄聯盟.

4個ref標簽,為什么只出來了3個結果?

因為Set集合中的元素是不可以重復的,所有兩個英雄聯盟只能顯示一個.

Map集合與Props集合:

修改游戲集合類:

public class GameCollection {
    //游戲集合
    private Map<String,Game> games;

    public Map<String, Game> getGames() {
        return games;
    }

    public void setGames(Map<String, Game> games) {
        this.games = games;
    }


    public void launch(){
        for(String key :games.keySet()){
            Game game = games.get(key);
            game.getGameName();
        }
    }
}

修改Spring Configuration配置文件:

    <bean id="mssj" class="com.ricky.zero.pojo.MSSJ"></bean>
    <bean id="cyhx" class="com.ricky.zero.pojo.CYHX"></bean>
    <bean id="yxlm" class="com.ricky.zero.pojo.YXLM"></bean>
    <bean id="gameCollection" class="com.ricky.zero.pojo.GameCollection">
        <property name="games">
            <map>
                <entry key="MSSJ" value-ref="mssj"/>
                <entry key="CYHX" value-ref="cyhx"/>
                <entry key="YXLM" value-ref="yxlm"/>
            </map>
        </property>
    </bean>

在Java中Map集合是用鍵值對來描述Map集合內的元素的,在上述配置充分的體現了Map的鍵值對元素模式.

運行測試,結果如下.

大家好,我的名字叫魔獸世界.
大家好,我的名字叫穿越火線.
大家好,我的名字叫英雄聯盟.

Props與Map的不同之處就是Map的鍵和值的類型可以是任意類型,而Props的鍵和值必須是String類型.由於時間關系不在演示.

 

4.裝配null

  Spring中,可以注入基本類型和bean的實例類型到參數列表中,Spring也提供了直接向參數列表中注入null值.

注入方法如下:

<property name="test"><null/></property>

 

 

由於明天還要上班,最后幾個事例沒有測試~~實在抱歉了.

--------------------------------申明----------------------------       

                  本文可以免費閱讀以及轉載,轉載時請注明出處.      

                  本人郵箱:Ricky_LS@163.com

                  Thank you for your corporation.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM