Bean的属性注入——为不同类型属性注值

来源:互联网 发布:sql语言怎么查询数据 编辑:程序博客网 时间:2024/06/03 10:36

注:为所有属性提供set方法,均采用set方式注入

下面定义一个Person类来演示Bean的属性注入:

public class Person {    private String name;    private int age;    private Car car;    //不列出set和get方法    @Override    public String toString() {        return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";    }}

在XML中声明一个bean:

<!-- 尚未为属性注值 --><bean id="person" class="com.Person"></bean>

(一)注入字面值
基本数据类型及其封装类、String等类型都可以采取字面值注入的方式

1、通过value属性注入

    <bean id="person" class="com.Person">        <property name="name" value="Jack"></property>        <property name="age" value="30"></property>    </bean>

一旦Person被实例化,Spring就会调用元素所指定属性的setter方法为该属性注入值。
在这里,value=”30”,会尝试把字符串”30”解析成int类型。
如果value=”xxx”,会尝试把字符串”xxx”解析成我们需要的类型(如果解析不成功,会抛异常)。

2、通过<value>子标签注入
property标签不仅提供了value属性,还提供了value子标签。

    <bean id="person" class="com.Person">        <property name="name">            <value>Jack</value>        </property>        <property name="age">            <value>20</value>        </property>    </bean>

子标签有点多此一举的感觉,用value属性就可以了,而且value属性更直观更方便。的确如此,但是在特殊情况下(例如:要注入的值里面包含XML特殊字符),不得不使用<value>子标签。

若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起来
我们想为person的name属性注入值“<Jack>”,必须这么做:

    <bean id="person" class="com.Person">        <property name="name">            <value><![CDATA[<Jack>]]></value>        </property>        <property name="age" value="20"></property>    </bean>

(二)外部bean
类Car的源码如下:

public class Car {    private String brand;    private String model;    private String color;    //不列出set和get方法    @Override    public String toString() {        return "Car [brand=" + brand + ", model=" + model + ", color=" + color + "]";    }}

我们首先在XML中声明一个Car类型的,代码如下:

    <bean id="car1" class="com.Car">        <property name="brand" value="奥迪"></property>        <property name="model" value="A6"></property>        <property name="color" value="黑色"></property>    </bean>

在person bean中通过ref属性引用这个外部的bean,代码如下:

    <bean id="person" class="com.Person">        <property name="name" value="jack"></property>        <property name="age" value="20"></property>        <property name="car" ref="car1"></property>    </bean>

property标签不仅提供了ref属性,还提供了ref子标签。引用外部bean,不仅可以通过ref属性,还可以通过ref子标签。

    <bean id="person1" class="com.Person" >        <property name="name" value="jack"></property>        <property name="age" value="20"></property>        <property name="car">            <ref bean="car1"/>        </property>    </bean>

(三)内部bean

    <bean id="person" class="com.Person">        <property name="name" value="jack"></property>        <property name="age" value="20"></property>        <property name="car">            <bean class="com.Car">                <property name="brand" value="奥迪"></property>                <property name="model" value="A6"></property>                <property name="color" value="黑色"></property>            </bean>        </property>    </bean>

①内部bean的id属性是多余的,没有必要给定id属性。
②外部根本无法引用内部bean
③内部Bean的最大缺点:它们不能被复用。内部Bean仅适用于一次注入,不能被其它Bean所引用。
④property标签和constructor-arg标签,都有子标签bean。因此在property标签和constructor-arg标签内部都可以声明内部bean。
(四)null值
property标签和constructor-arg标签,都有子标签null。用于为属性赋null(用的不太多,毕竟引用类型的属性的初始值就是null)。

    <bean id="person1" class="com.Person">        <property name="car">            <null></null>        </property>    </bean>

有关集合属性的值注入问题,将在接下来的章节讲解

原创粉丝点击