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就不會進行合併;
控制檯輸出: