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

注:为所有属性提供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>

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值