Spring框架:bean属性配置细节

版权声明:关注微信公众号:摸鱼科技资讯,联系我们 https://blog.csdn.net/qq_36949176/article/details/86491787

 

属性值含有特殊字符

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

猜你喜欢

转载自blog.csdn.net/qq_36949176/article/details/86491787