1 包含 XML 特殊符號(hào)
在 Spring 配置文件中聊记,可以使用字面值來(lái)提供配置的值。如果配置的值包含 XML 特殊符號(hào)恢暖,那么可以在屬性值外添加一個(gè) XML 特殊處理標(biāo)簽 <![CDATA[]]>
排监,作用是讓 XML 解析器將標(biāo)簽中的字符串當(dāng)作普通文本來(lái)對(duì)待。
XML 中有 5 個(gè)特殊字符杰捂,有兩種方式可以對(duì)這些字符進(jìn)行特別處理舆床。
- 使用標(biāo)簽
<![CDATA[]]>
,來(lái)包裹特殊字符嫁佳。 - 使用 XML 轉(zhuǎn)義序列來(lái)表示這些字符挨队。
特殊字符 | 轉(zhuǎn)義序列 |
---|---|
< |
< |
> |
> |
& |
& |
" |
" |
' |
' |
注意: Spring 不會(huì)忽略標(biāo)簽內(nèi)容字符串的前后空格。
2 引用其他 Bean
Spring IoC 容器中定義的 Bean 可以相互引用蒿往。
<bean id="author" class="net.deniro.spring4.bean.Author">
<property name="name" value="deniro"/>
</bean>
<bean id="book" class="net.deniro.spring4.bean.Book">
<property name="author">
<ref bean="author"></ref>
</property>
</bean>
<ref>
元素可以通過(guò)以下 3 個(gè)屬性引用容器中的其他 Bean:
屬性 | 說(shuō)明 |
---|---|
bean | 可以引用同一容器或父容器中的 Bean盛垦。 |
local | 只能引用同一個(gè)配置文件中定義的 Bean,會(huì)自動(dòng)檢查合法性 瓤漏。 |
parent | 引用父容器中的 Bean 腾夯,如 <ref parent="xxx"> ,說(shuō)明這個(gè) Bean 的父容器是 xxx蔬充。 |
父容器配置:
<!-- 父容器-->
<bean id="author" class="net.deniro.spring4.bean.Author">
<property name="name" value="deniroFather"/>
</bean>
子容器配置:
<bean id="author" class="net.deniro.spring4.bean.Author">
<property name="name" value="deniro"/>
</bean>
<bean id="book" class="net.deniro.spring4.bean.Book">
<property name="author">
<ref parent="author"/>
</property>
</bean>
子容器配置中存在與父容器相同的 bean id(這里是 author)蝶俱,在 book 中,我們使用的是 <ref parent="author"/>
饥漫,所以它引用的是父容器的 Bean榨呆。
ApplicationContext parent = new ClassPathXmlApplicationContext
(new String[]{"parent.xml"});
ApplicationContext context = new ClassPathXmlApplicationContext(new
String[]{"beans.xml"},
parent);////把父容器上下文作為參數(shù)傳入
3 內(nèi)部 Bean
如果某個(gè) Bean 只在一個(gè)確定的 Bean 中被引用,那么它可以以內(nèi)部 Bean 的形式被引用:
<bean id="book" class="net.deniro.spring4.bean.Book">
<property name="author">
<bean class="net.deniro.spring4.bean.Author">
<property name="name" value="deniro"/>
</bean>
</property>
</bean>
內(nèi)部 Bean 與 Java 的匿名內(nèi)部類類似庸队,它沒(méi)有名字愕提,所以只能在聲明處注入實(shí)例馒稍。
注意:內(nèi)部 Bean 的 id、name 與 scope 屬性配置是無(wú)效的浅侨,scope 屬性默認(rèn)為 prototype纽谒,無(wú)法更改。
4 null 值
有時(shí)候需要注入一個(gè) null 值如输,那么可以使用 <null/>
:
<bean id="book2" class="net.deniro.spring4.bean.Book">
<property name="name"><null/></property>
</bean>
5 級(jí)聯(lián)屬性
Spring 支持級(jí)聯(lián)屬性鼓黔。假設(shè)我們希望在 book 中直接注入 author 的名字:
<bean id="book3" class="net.deniro.spring4.bean.Book">
<property name="author.name" value="deniro"/>
</bean>
還需要初始化 Book 類的 author 屬性:
private Author author=new Author();
如果沒(méi)有初始化 author 屬性,Spring 將拋出 NullValueInNestedPathException 異常不见。
只要配置的 Bean 擁有對(duì)應(yīng)于級(jí)聯(lián)屬性的類結(jié)構(gòu)澳化,就可以配置任意層級(jí)的級(jí)聯(lián)屬性。
6 集合類型
Spring 為 List稳吮、Set缎谷、Map 與 Properties 提供了專屬的配置標(biāo)簽。
6.1 List
<bean id="book4" class="net.deniro.spring4.bean.Book">
<property name="labels">
<list>
<value>歷史</value>
<value>傳記</value>
</list>
</property>
</bean>
為 Book 添加 labels 屬性:
/**
* 標(biāo)簽
*/
private List<String> labels=new ArrayList<String>();
public List<String> getLabels() {
return labels;
}
public void setLabels(List<String> labels) {
this.labels = labels;
}
list 屬性既可以通過(guò) <value>
注入字符串灶似,也可以使用 <ref>
注入容器中的其他 Bean列林。
注意: 一個(gè)屬性類型,如果可以通過(guò)字符串的字面值進(jìn)行配置酪惭,那么該類型所對(duì)應(yīng)的數(shù)組類型(如:String[]
希痴、int[]
)也可以采用 <list>
的方式進(jìn)行配置。
6.2 Set
Set 配置與 List 配置相似:
<bean id="book5" class="net.deniro.spring4.bean.Book">
<property name="labelSet">
<set>
<value>歷史</value>
<value>傳記</value>
</set>
</property>
</bean>
labelSet 在 Book 中必須是 Set 類型:
private Set<String> labelSet=new HashSet<String>();
public Set<String> getLabelSet() {
return labelSet;
}
public void setLabelSet(Set<String> labelSet) {
this.labelSet = labelSet;
}
6.3 Map
我們?yōu)?Book 添加版本說(shuō)明:
/**
* 版本
*/
private Map<String,String> versions=new HashMap();
public Map<String, String> getVersions() {
return versions;
}
public void setVersions(Map<String, String> versions) {
this.versions = versions;
}
配置:
<bean id="book6" class="net.deniro.spring4.bean.Book">
<property name="versions">
<map>
<entry>
<key><value>1</value></key>
<value>2017-1</value>
</entry>
<entry>
<key><value>2</value></key>
<value>2017-2</value>
</entry>
</map>
</property>
</bean>
如果某個(gè) Map 元素的鍵與值是對(duì)象春感,那么可以這樣配置:
<entry>
<key><ref bean="keyBean"/></key>
<ref bean="valueBean"/>
</entry>
6.4 Properties
Map 元素的鍵與值可以是任意類型對(duì)象砌创,而 Properties 元素的鍵與值只能是字符串,所以 Properties 元素其實(shí)是 Map 元素的特殊情況鲫懒。
我們?yōu)?Author 添加地址屬性列:
/**
* 地址
*/
private Properties addresses=new Properties();
public Properties getAddresses() {
return addresses;
}
public void setAddresses(Properties addresses) {
this.addresses = addresses;
}
配置:
<bean id="author1" class="net.deniro.spring4.bean.Author">
<property name="addresses">
<props>
<prop key="home">北京</prop>
<prop key="work">杭州</prop>
</props>
</property>
</bean>
因?yàn)?Properties 元素的鍵值只能是字符串嫩实,所以配置上比 Map 來(lái)的簡(jiǎn)單。
6.5 強(qiáng)類型集合
強(qiáng)類型指的是包裝類型窥岩,如果 POJO 中甲献,存在強(qiáng)類型的集合,Spring 也可以注入:
/**
* 收入
*/
private Map<String,Double> income=new HashMap<String, Double>();
public Map<String, Double> getIncome() {
return income;
}
public void setIncome(Map<String, Double> income) {
this.income = income;
}
配置:
<bean id="author2" class="net.deniro.spring4.bean.Author">
<property name="income">
<map>
<entry>
<key>
<value>第一季度</value>
</key>
<value>20000.00</value>
</entry>
<entry>
<key>
<value>第二季度</value>
</key>
<value>30000.00</value>
</entry>
</map>
</property>
</bean>
Spring 容器在注入強(qiáng)類型集合時(shí)谦秧,會(huì)判斷元素的類型竟纳,把相應(yīng)的配置值轉(zhuǎn)換為對(duì)應(yīng)的數(shù)據(jù)類型。
6.6 合并集合
Spring 允許子 <bean>
繼承 父 <bean>
中同名屬性的集合元素疚鲤。
<!-- 父 Bean -->
<bean id="fatherBook" class="net.deniro.spring4.bean.Book" abstract="true">
<property name="labels">
<list>
<value>歷史</value>
<value>地理</value>
</list>
</property>
</bean>
<!-- 子 Bean -->
<bean id="childBook" class="net.deniro.spring4.bean.Book" parent="fatherBook">
<property name="labels">
<list merge="true">
<value>天文</value>
<value>數(shù)學(xué)</value>
</list>
</property>
</bean>
配置中把父 bean 的 abstract 屬性設(shè)置為 true锥累,表示是一個(gè)抽象的 Bean;然后在子 Bean的 parent 屬性中指定父 bean 的 id集歇;最后把集合標(biāo)簽的 merge 設(shè)置為 true桶略,表示合并。
6.7 集合類型的 Bean
上面所說(shuō)的都是在一個(gè) Bean 中配置集合類型的屬性。如果需要一個(gè)集合類型的 Bean际歼,則需要使用 util 命名空間惶翻。首先在 Spring 的配置文件頭中引入 util 命名空間:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd
">
配置 List:
<util:list id="type" list-class="java.util.LinkedList">
<value>人文</value>
<value>科技</value>
</util:list>
配置 Set:
<util:set id="type2" set-class="java.util.HashSet">
<value>人文</value>
<value>科技</value>
</util:set>
配置 Map:
<util:map id="config" map-class="java.util.HashMap">
<entry key="賬號(hào)" value="admin"/>
<entry key="密碼" value="123456"/>
</util:map>
提示:
- xxx-class 屬性為可選項(xiàng)。
-
<util:list>
與<util:set>
擁有 value-type 屬性鹅心,可以指定集合中的值類型吕粗。 -
<util:map>
擁有 key-type 和 value-type 屬性,可以指定 Map 的鍵或值的類型旭愧。