Bean管理-注入属性
概念
什么是 Bean 管理?
- 由 Spring 创建和销毁对象,
- 由 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 类中的属性注入数据,有两种方式是可以实现属性注入:
- 构造器注入,
- setter 方法注入。
首先看 setter 方法注入吧,因为之前我们为 User 类创建了 setter/getter 方法,这里直接就可以使用了。
Setter 注入
property 标签注入
User 类无需修改,只需修改 spring.xml 配置文件即可:

<bean class="bean.User" id="user">
<property name="name" value="guodongAndroid"/>
<property name="age" value="18"/>
</bean>
在 bean 标签中增加 property 标签,其中 name 属性的值是 User 类中的属性名,value 属性的值是为 User 类中的属性注入的数据。
下面运行测试代码,输出结果如下:

User{name='guodongAndroid', age=18}
p 命名空间注入
同样无需修改 User 类,只需修改 spring.xml 配置文件:

<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:name 为 User 类中的 name 属性注入数据,p:age 以此类推。
下面运行测试代码,输出结果如下:

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':

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

<bean class="bean.User" id="user">
<constructor-arg name="name" value="guodongAndroid" />
<constructor-arg name="age" value="20" />
</bean>
在 bean 标签中增加 constructor-arg 标签,其中 name 属性对应构造器中的形参,value 属性为注入的数据。
下面运行测试代码,输出结果如下:

User{name='guodongAndroid', age=20}
c 命名空间注入
修改配置文件,引入 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:name 为 User 类的有参构造器的形参注入数据,c:age 以此类推。
下面运行测试代码,输出结果如下:

User{name='guodongAndroid', age=21}
总结
本文学习了通过配置文件为 Bean 注入属性的几种方式:
- 构造器注入:
- 通过
constructor-arg标签, - 通过
c命名空间。
- 通过
- setter 注入:
- 通过
property标签, - 通过
p命名空间。
- 通过
