屬性值含有特殊字符
<!-- 如果字面值包含特殊字符可以用<![CDATA[]]包裹起來 -->
<!-- 屬性值也可以使用value子節點進行配置 -->
<bean>
<constructor-arg>
<value><![CDATA[<shanghai^>]]></value>
</constructor-arg>
</bean>
ref屬性建立bean之間的引用關系
<!-- 可以使用property的ref屬性建立bean之間的引用關系。通過id關聯-->
<!-- 第一種 -->
<property name="car" ref="car2"></property>
<!-- 第二種 -->
<property name="car">
<ref bean="car2"/>
</property>
內部bean只能在內部使用
- 當bean實例僅僅給一個特定的屬性使用時,可以將其聲明為內部bean,內部bean聲明直接包含在<property>或<constructor-arg>元素里,不需要設置任何id或name屬性
- 內部bean不能使用在任何其他地方
<bean id="person" class="com.yorkmass.spring.beans.Person">
<property name="name" value="fort"></property>
<property name="age" value="24"></property>
<property name="car" >
<!-- 內部bean不能被外部引用,只能在內部使用 -->
<bean class="com.yorkmass.spring.beans.Car">
<constructor-arg value="yorkmass"></constructor-arg>
<constructor-arg value="changan"></constructor-arg>
<constructor-arg value="20000" type="double"></constructor-arg>
</bean>
</property>
</bean>
Null值
可以使用專用的<null/>元素標簽為Bean的字符串或者其他對象類型的屬性注入null值
<constructor-arg value="Jerry"></constructor-arg>
...
<constructor-arg><null/></constructor-arg>
<!--null值的專有標記<null/>-->
級聯屬性賦值
代碼前提描述:構造方法中的參數string name,int age,Car car
Car里面構造方法中的參數有3個,第四個屬性為maxSpeed
外部bean情況:
<bean id="person2" class="com.yorkmass.spring.beans.Person">
<constructor-arg value="jerry"></constructor-arg>
<constructor-arg value="25"></constructor-arg>
<!-- <constructor-arg><null/></constructor-arg> -->
<constructor-arg ref="car"></constructor-arg>
<property name="car.maxSpeed" value="250"></property>
<!-- 對級聯屬性賦值 ,注意:屬性需要先初始化后才可以為級聯屬性賦值,否則會有異常,和Struts2不同,Struts2會自動創建-->
</bean>
內部bean情況:
<bean id="person" class="com.yorkmass.spring.beans.Person">
<property name="name" value="fort"></property>
<property name="age" value="24"></property>
<!-- 內部bean不能被外部引用,只能在內部使用 -->
<property name="car" >
<bean class="com.yorkmass.spring.beans.Car">
<constructor-arg value="yorkmass"></constructor-arg>
<constructor-arg value="changan"></constructor-arg>
<constructor-arg value="20000" type="double"></constructor-arg>
</bean>
</property>
<property name="car.maxSpeed" value="260"></property>
<!--為級聯屬性賦值-->
</bean>
集合屬性
•在 Spring中可以通過一組內置的 xml 標簽(例如: <list>, <set> 或 <map>) 來配置集合屬性.
•配置 java.util.List 類型的屬性, 需要指定 <list> 標簽, 在標簽里包含一些元素. 這些標簽可以通過 <value> 指定簡單的常量值, 通過 <ref> 指定對其他 Bean 的引用. 通過<bean> 指定內置 Bean 定義. 通過 <null/> 指定空元素. 甚至可以內嵌其他集合.
•數組的定義和 List 一樣, 都使用 <list>
•配置 java.util.Set 需要使用 <set> 標簽, 定義元素的方法與 List 一樣.
•Java.util.Map 通過 <map> 標簽定義, <map> 標簽里可以使用多個 <entry> 作為子標簽. 每個條目包含一個鍵和一個值.
•必須在 <key> 標簽里定義鍵
•因為鍵和值的類型沒有限制, 所以可以自由地為它們指定 <value>, <ref>, <bean> 或 <null> 元素.
•可以將 Map 的鍵和值作為 <entry> 的屬性定義: 簡單常量使用 key 和 value 來定義; Bean 引用通過 key-ref 和 value-ref 屬性定義
•使用 <props> 定義 java.util.Properties, 該標簽使用多個 <prop> 作為子標簽. 每個 <prop> 標簽必須定義 key 屬性.
例子:一個人有多輛車
<List>和<set>例子
package com.yorkmass.spring.beans.collections;
import java.util.List;
import com.yorkmass.spring.beans.Car;
public class Person {
private String name;
private int age;
private List<Car> cars;
public Person(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<Car> getCars() {
return cars;
}
public void setCars(List<Car> cars) {
this.cars = cars;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", cars=" + cars + "]";
}
}
<!-- 測試如何配置集合屬性 -->
<bean id="person3" class="com.yorkmass.spring.beans.collections.Person">
<property name="name" value="mike"></property>
<property name="age" value="25"></property>
<property name="cars">
<!-- 使用list節點為List類型的屬性賦值 -->
<list>
<ref bean="car"/>
<ref bean="car2"/>
</list>
</property>
</bean>
<Map>例子:使用map節點的entry子節點配置Map類型的成員變量
package com.yorkmass.spring.beans.collections;
import java.util.List;
import java.util.Map;
import com.yorkmass.spring.beans.Car;
public class NewPerson {
private String name;
private int age;
private Map<String,Car> cars;
public NewPerson(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Map<String, Car> getCars() {
return cars;
}
public void setCars(Map<String, Car> cars) {
this.cars = cars;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", cars=" + cars + "]";
}
}
<!-- 配置Map屬性值 -->
<bean id="newPerson" class="com.yorkmass.spring.beans.collections.NewPerson">
<property name="name" value="Rose"></property>
<property name="age" value="28"></property>
<property name="cars">
<!--使用map節點及map子節點的entry子節點配置Map類型的成員變量-->
<map>
<entry key="AA" value-ref="car"></entry>
<entry key="BB" value-ref="car2"></entry>
</map>
</property>
</bean>
Properties屬性:使用props和prop子節點來為Properties屬性賦值
package com.yorkmass.spring.beans.collections;
import java.util.Properties;
public class DataSource {
private Properties properties;
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public String toString() {
return "DataSource [properties=" + properties + "]";
}
}
<!-- 配置Properties屬性值 -->
<bean id="dataSource" class="com.yorkmass.spring.beans.collections.DataSource">
<property name="properties">
<!-- 使用props和prop子節點來為Properties屬性賦值 -->
<props>
<prop key="user">root</prop>
<prop key="password">1234</prop>
<prop key="jdbcUrl">jdbc:mysql://test</prop>
<prop key="driverClass">com.mysql.jdbc.Driver</prop>
</props>
</property>
</bean>
配置獨立的集合Bean,以便其他bean引用
導入util命名空間,在xml編輯區域下找到Namespaces點開出現下圖界面,將util勾選如下圖所示
使用基本集合標簽定義集合時,不能將集合作為獨立的Bean定義,導致其他Bean無法引用該集合,所以無法在不同Bean之間共享集合
可以使用util schema 里的集合標簽定義獨立的集合Bean,需要注意的是,必須在<beans>根元素里添加util schema定義
<!-- 配置獨立的集合bean, 以供多個bean進行引用,需要導入util命名空間-->
<util:list id="cars">
<ref bean="car"/>
<ref bean="car2"/>
</util:list>
<bean id="person4" class="com.yorkmass.spring.beans.collections.Person">
<property name="name" value="jack"></property>
<property name="age" value="30"></property>
<property name="cars" ref="cars"></property>
</bean>
P命名空間
為了簡化XML文件的配置,越來越多的XML文件采用屬性而非子元素配置信息。
Spring從2.5版本開始引入了一個新的P命名空間,可以通過<bean>元素屬性的方式配置Bean屬性。
使用p命名空間后,基於XML的配置方式將進一步簡化,導入P命名空間步驟和util同理
<!-- 通過P命名空間為bean的屬性賦值,需要先導入P命名空間,相對應傳統的配置方式更加簡潔-->
<bean id="person5" class="com.yorkmass.spring.beans.collections.Person" p:age="30" p:name="queen" p:cars-ref="cars"></bean>