Spring框架:bean屬性配置細節


 

屬性值含有特殊字符

<!-- 如果字面值包含特殊字符可以用<![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>


免責聲明!

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



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