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属性注入

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

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

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

    <bean id="person" class="com.Person">
        <property name="name">
            <value>Jackvalue>
        property>

        <property name="age">
            <value>20value>
        property>
    bean>

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

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

    <bean id="person" class="com.Person">
        <property name="name">
            <value>]]>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类型的,代码如下:

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

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

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

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

    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

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

①内部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>

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

你可能感兴趣的:(Spring)