zoukankan      html  css  js  c++  java
  • 属性配置的细节

        先说说上一讲的例子,在配置文件中我们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>

     

        

  • 相关阅读:
    Golang基础笔记
    PHP面试题
    PHP操作文件常用函数
    转:C#委托与事件
    转:Tkinter教程之Text(2)篇
    Tkinter教程之Text篇(1)
    转:Python 从FTP 下载数据的例子
    转:Python模块学习 ---- httplib HTTP协议客户端实现
    转:Python yield 使用浅析
    有用的网址地址
  • 原文地址:https://www.cnblogs.com/figsprite/p/10757172.html
Copyright © 2011-2022 走看看