属性配置的细节

    先说说上一讲的例子,在配置文件中我们value使用的是字符串,如果对应属性是数字类型,Spring可以自动将字符串转成数字类型,这里介绍另外一种使用<value>子节点标签的形式配置。

 

    我们配value的值时如果是基本数据类型或者String都可以采取这两种方法,

  1. <bean id="car2" class="com.figsprite.bean.Car">  
  2.     <constructor-arg  type="java.lang.String">  
  3.         <value>海南马自达</value>  
  4.     </constructor-arg>  
  5.     <constructor-arg  type="java.lang.String">  
  6.         <value>海南</value>  
  7.     </constructor-arg>  
  8.     <constructor-arg type="int">  
  9.         <value>255</value>  
  10.     </constructor-arg>  
  11. </bean>  

如果配的值里面有特殊字符可以用<![CDATA[]]>把值包住,比如如果我们想把产地用<>包住,那么就不能简简单单的直接写对<>,此时就不能使用value属性赋值的方法,只能使用子节点的方式

 

 

引用其他Bean

    我们先写一个新的Bean:

  1. package com.figsprite.bean;  
  2.     
  3. public class Car {  
  4.     private String brand;  
  5.     private String corp;  
  6.     private double price;  
  7.     private int maxSpeed;  
  8.     
  9.     
  10.     
  11.     public Car(String brand, String corp, double price) {  
  12.         this.brand = brand;  
  13.         this.corp = corp;  
  14.         this.price = price;  
  15.     }  
  16.     
  17.     public Car(String brand, String corp, int maxSpeed) {  
  18.         this.brand = brand;  
  19.         this.corp = corp;  
  20.         this.maxSpeed = maxSpeed;  
  21.     }  
  22.     
  23.     @Override  
  24.     public String toString() {  
  25.         return "Car{" +  
  26.                 "brand='" + brand + '\'' +  
  27.                 ", corp='" + corp + '\'' +  
  28.                 ", price=" + price +  
  29.                 ", maxSpeed=" + maxSpeed +  
  30.                 '}';  
  31.     }  
  32. }  

接着来到配置文件:

 

    Car属性我们该如何配置,此时就要用到ref这个属性,建立Bean之间的引用关系,也可以用<ref>子节点标签

  1. <bean id="person" class="com.figsprite.bean.Person">  
  2.     <property name="name" value="小明"/>  
  3.     <property name="age" value="15"/>  
  4.     <property name="car" ref="car2"/>  
  5. </bean>  

 

  1. <bean id="person" class="com.figsprite.bean.Person">  
  2.     <property name="name" value="小明"/>  
  3.     <property name="age" value="15"/>  
  4.     <property name="car">  
  5.         <ref bean="car2"/>  
  6.     </property>  
  7. </bean>  

 

我们还可以在属性或者构造器里包含Bean声明,这样的Bean称为内部Bean

  1. <bean id="person" class="com.figsprite.bean.Person">  
  2.     <property name="name" value="小明"/>  
  3.     <property name="age" value="15"/>  
  4.     <property name="car">  
  5.         <bean class="com.figsprite.bean.Car">  
  6.             <constructor-arg value="丰田" type="java.lang.String"></constructor-arg>  
  7.             <constructor-arg value="日本" type="java.lang.String"/>  
  8.             <constructor-arg value="3000000" type="double"/>  
  9.         </bean>  
  10.     </property>  
  11. </bean>  

这个内部Bean没有id,也不能被外部引用。

注入参数 null

我们可以使用专用的<null/>标签为Bean的字符串或者其他对象类型的属性注入null值,当然这个意义不大,因为我们可以直接在Bean里面默认值为null,

    <constructor-arg ><null/></constructor-arg>

注入参数 级联属性

    在Person.java中添加一个构造器,注意此时要额外添加一个无参的构造器,

  1. public Person(String name, int age, Car car) {  
  2.     this.name = name;  
  3.     this.age = age;  
  4.     this.car = car;  
  5. }  

接下来来到配置文件:

  1. <bean  id="person2" class="com.figsprite.bean.Person">  
  2.     <constructor-arg value="小王"/>  
  3.     <constructor-arg value="17"/>  
  4.     <constructor-arg ref="car"/>  
  5.     <property name="car.brand" value="大众"/>  
  6.     <property name="car.corp" value="北京"/>  
  7.     <property name="car.price" value="23333"/>  
  8.     <property name="car.maxSpeed" value="100"/>  
  9. </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进行测试,

  1. <bean id="person3" class="com.figsprite.bean.collection.Person">  
  2.     <property name="name" value="土豪"/>  
  3.     <property name="age" value="60"/>  
  4.     <property name="carList">  
  5.         <list>  
  6.             <ref bean="car4"/>  
  7.             <ref bean="car3"/>  
  8.         </list>  
  9.     </property>  
  10. </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>

  1. <bean id="newPerson" class="com.figsprite.bean.collection.NewPerson">  
  2.     <property name="name" value="大土豪"/>  
  3.     <property name="age" value="49"/>  
  4.     <property name="carMap">  
  5.         <map>  
  6.             <entry key="1" value-ref="car4"/>  
  7.             <entry key="2" value-ref="car3"/>  
  8.         </map>  
  9.     </property>  
  10. </bean>  

如果里面的值是基本类型或者String,我们可以用value属性。

Property

    然后说说Property,我们可以使用<props>和<prop>子节点来为Properties属性赋值

 

 

 

<util>

    如果我们在多个bean里面都使用到了相同的集合,需要再重新写一份吗?感觉有些麻烦,因此Spring提供了一个<util>标签,根据需求不同,Spring提供了不同的标签,不过这里需要最外层的<beans>引入一个属性,如果使用的是IDEA,这里可以自动引入,

 

 

  1. <util:list id="cars">  
  2.     <ref bean="car3"/>  
  3.     <ref bean="car4"/>  
  4. </util:list>  

 

 

  1. <bean id="person4" class="com.figsprite.bean.collection.Person">  
  2.     <property name="name" value="宇宙无敌大土豪"/>  
  3.     <property name="age" value="60"/>  
  4.     <property name="carList" ref="cars"/>  
  5. </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>

 

    

posted @ 2019-04-23 16:25  FigSprite  阅读(221)  评论(0编辑  收藏  举报