先说说上一讲的例子,在配置文件中我们value使用的是字符串,如果对应属性是数字类型,Spring可以自动将字符串转成数字类型,这里介绍另外一种使用<value>子节点标签的形式配置。
我们配value的值时如果是基本数据类型或者String都可以采取这两种方法,
- <bean id="car2" class="com.figsprite.bean.Car">
- <constructor-arg type="java.lang.String">
- <value>海南马自达</value>
- </constructor-arg>
- <constructor-arg type="java.lang.String">
- <value>海南</value>
- </constructor-arg>
- <constructor-arg type="int">
- <value>255</value>
- </constructor-arg>
- </bean>
如果配的值里面有特殊字符可以用<![CDATA[]]>把值包住,比如如果我们想把产地用<>包住,那么就不能简简单单的直接写对<>,此时就不能使用value属性赋值的方法,只能使用子节点的方式
引用其他Bean
我们先写一个新的Bean:
- package com.figsprite.bean;
- public class Car {
- private String brand;
- private String corp;
- private double price;
- private int maxSpeed;
- public Car(String brand, String corp, double price) {
- this.brand = brand;
- this.corp = corp;
- this.price = price;
- }
- public Car(String brand, String corp, int maxSpeed) {
- this.brand = brand;
- this.corp = corp;
- this.maxSpeed = maxSpeed;
- }
- @Override
- public String toString() {
- return "Car{" +
- "brand='" + brand + '\'' +
- ", corp='" + corp + '\'' +
- ", price=" + price +
- ", maxSpeed=" + maxSpeed +
- '}';
- }
- }
接着来到配置文件:
Car属性我们该如何配置,此时就要用到ref这个属性,建立Bean之间的引用关系,也可以用<ref>子节点标签
- <bean id="person" class="com.figsprite.bean.Person">
- <property name="name" value="小明"/>
- <property name="age" value="15"/>
- <property name="car" ref="car2"/>
- </bean>
- <bean id="person" class="com.figsprite.bean.Person">
- <property name="name" value="小明"/>
- <property name="age" value="15"/>
- <property name="car">
- <ref bean="car2"/>
- </property>
- </bean>
我们还可以在属性或者构造器里包含Bean声明,这样的Bean称为内部Bean
- <bean id="person" class="com.figsprite.bean.Person">
- <property name="name" value="小明"/>
- <property name="age" value="15"/>
- <property name="car">
- <bean class="com.figsprite.bean.Car">
- <constructor-arg value="丰田" type="java.lang.String"></constructor-arg>
- <constructor-arg value="日本" type="java.lang.String"/>
- <constructor-arg value="3000000" type="double"/>
- </bean>
- </property>
- </bean>
这个内部Bean没有id,也不能被外部引用。
注入参数 null
我们可以使用专用的<null/>标签为Bean的字符串或者其他对象类型的属性注入null值,当然这个意义不大,因为我们可以直接在Bean里面默认值为null,
<constructor-arg ><null/></constructor-arg>
注入参数 级联属性
在Person.java中添加一个构造器,注意此时要额外添加一个无参的构造器,
- public Person(String name, int age, Car car) {
- this.name = name;
- this.age = age;
- this.car = car;
- }
接下来来到配置文件:
- <bean id="person2" class="com.figsprite.bean.Person">
- <constructor-arg value="小王"/>
- <constructor-arg value="17"/>
- <constructor-arg ref="car"/>
- <property name="car.brand" value="大众"/>
- <property name="car.corp" value="北京"/>
- <property name="car.price" value="23333"/>
- <property name="car.maxSpeed" value="100"/>
- </bean>
查看输出:
Person{name='小王', age=17, car=Car{brand='大众', corp='北京', price=23333.0, maxSpeed=100}}
这里注意:我们需要先为car属性赋值,才可以再为car的属性赋值,即属性需要先初始化后才可以为级联属性赋值,否则会出现异常
集合属性
队列、数组、集合
我们创建一个新的包,然后将Person和Car复制一份过去,修改一下Person:
private String name;
private int age;
private List<Car> carList;
为了不加长长的包名,我们在新的包里也创建Main.java进行测试,
- <bean id="person3" class="com.figsprite.bean.collection.Person">
- <property name="name" value="土豪"/>
- <property name="age" value="60"/>
- <property name="carList">
- <list>
- <ref bean="car4"/>
- <ref bean="car3"/>
- </list>
- </property>
- </bean>
Person{name='土豪', age=60, carList=[Car{brand='海南马自达', corp='<海南>', price=0.0, maxSpeed=255}, Car{brand='null', corp='上海', price=3000000.0, maxSpeed=0}]}
<list>中间可以使用<ref>、或者是内部Bean,如果是数字类型或者String,那么直接写上<value>标签。
如果是属性数组为数组,那么依然用<list>标签赋值,如果是Set,那么使用<set>标签
Map
接着来说说Map,我们可以用<map>标签里面再套着<entry>
- <bean id="newPerson" class="com.figsprite.bean.collection.NewPerson">
- <property name="name" value="大土豪"/>
- <property name="age" value="49"/>
- <property name="carMap">
- <map>
- <entry key="1" value-ref="car4"/>
- <entry key="2" value-ref="car3"/>
- </map>
- </property>
- </bean>
如果里面的值是基本类型或者String,我们可以用value属性。
Property
然后说说Property,我们可以使用<props>和<prop>子节点来为Properties属性赋值
<util>
如果我们在多个bean里面都使用到了相同的集合,需要再重新写一份吗?感觉有些麻烦,因此Spring提供了一个<util>标签,根据需求不同,Spring提供了不同的标签,不过这里需要最外层的<beans>引入一个属性,如果使用的是IDEA,这里可以自动引入,
- <util:list id="cars">
- <ref bean="car3"/>
- <ref bean="car4"/>
- </util:list>
- <bean id="person4" class="com.figsprite.bean.collection.Person">
- <property name="name" value="宇宙无敌大土豪"/>
- <property name="age" value="60"/>
- <property name="carList" ref="cars"/>
- </bean>
Person{name='宇宙无敌大土豪', age=60, carList=[Car{brand='null', corp='上海', price=3000000.0, maxSpeed=0}, Car{brand='海南马自达', corp='<海南>', price=0.0, maxSpeed=255}]}
这样即使我们在<util:list>配置内部Bean,也可以被共享了
使用p命名空间
Spring2.5版本开始引入了一个新的p命名空间,可以通过<bean>元素属性的方式配置Bean的属性,使用p命名空间后,基于XML配置方法将进一步简化,我们需要先导入命名空间xmlns:p="http://www.springframework.org/schema/p",IDEA可以自动帮我们完成这一步。
<bean id="person5" class="com.figsprite.bean.collection.Person" p:age="30" p:name="大壮" p:carList-ref="cars">
</bean>