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
命名空间。
- 通过