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