跳至主要內容

Bean管理-注入属性

guodongAndroid大约 3 分钟

概念

什么是 Bean 管理?

  1. 由 Spring 创建和销毁对象,
  2. 由 Spring 为 Bean 注入属性。

今日笔者学习下基于 xml 配置文件的方式为 Bean 注入属性。

注入

上一篇文章 中,我们创建了 User 类,并在 spring.xml 中注册进了 Spring IOC 容器中,最后测试时也从容器中获取并输出了 User 类的实例,但是输出的内容都是默认值。

package bean;

public class User {

    private String name;

    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
    }
}

接下来我们为 User 类中的属性注入数据,有两种方式是可以实现属性注入:

  1. 构造器注入,
  2. setter 方法注入。

首先看 setter 方法注入吧,因为之前我们为 User 类创建了 setter/getter 方法,这里直接就可以使用了。

Setter 注入

property 标签注入

User 类无需修改,只需修改 spring.xml 配置文件即可:

modify-spring-config-xml

<bean class="bean.User" id="user">
    <property name="name" value="guodongAndroid"/>
    <property name="age" value="18"/>
</bean>

bean 标签中增加 property 标签,其中 name 属性的值是 User 类中的属性名,value 属性的值是为 User 类中的属性注入的数据。

下面运行测试代码,输出结果如下:

setter-run-test-result

User{name='guodongAndroid', age=18}

p 命名空间注入

同样无需修改 User 类,只需修改 spring.xml 配置文件:

modify-spring-config-p

<beans xmlns:p="http://www.springframework.org/schema/p" >

    <bean class="bean.User" id="user" p:name="guodongAndroid" p:age="19"/>
</beans>

首先在配置文件中引入 p 命名空间,然后就可以在 bean 标签中使用 p:nameUser 类中的 name 属性注入数据,p:age 以此类推。

下面运行测试代码,输出结果如下:

p-run-test-result

User{name='guodongAndroid', age=19}

构造器注入

需要修改 User 类,增加有参构造器:

package bean;

public class User {

    private String name;

    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    ....
}

constructor-arg 标签注入

User 类增加有参构造器后,spring.xml 配置文件会提示错误信息:No matching constructor found in class 'User':

no-matching-constructor

错误信息是指在 User 类中找不到匹配的构造器,因为 bean 标签默认使用无参构造器。在提示信息中也为我们提供了解决方案:添加 constructor-arg 标签,下面我们修改 spring.xml 配置文件:

modify-spring-config-constructor

<bean class="bean.User" id="user">
    <constructor-arg name="name" value="guodongAndroid" />
    <constructor-arg name="age" value="20" />
</bean>

bean 标签中增加 constructor-arg 标签,其中 name 属性对应构造器中的形参,value 属性为注入的数据。

下面运行测试代码,输出结果如下:

constructor-run-test-result

User{name='guodongAndroid', age=20}

c 命名空间注入

修改配置文件,引入 c 命名空间,实现注入:

modify-spring-config-c

<beans xmlns:c="http://www.springframework.org/schema/c" >

    <bean class="bean.User" id="user" c:name="guodongAndroid" c:age="21"/>
</beans>

首先在配置文件中引入 c 命名空间,然后就可以在 bean 标签中使用 c:nameUser 类的有参构造器的形参注入数据,c:age 以此类推。

下面运行测试代码,输出结果如下:

c-run-test-result

User{name='guodongAndroid', age=21}

总结

本文学习了通过配置文件为 Bean 注入属性的几种方式:

  1. 构造器注入:
    1. 通过 constructor-arg 标签,
    2. 通过 c 命名空间。
  2. setter 注入:
    1. 通过 property 标签,
    2. 通过 p 命名空间。

今日学习记录open in new window