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