[Spring实战系列]Spring注入方式之setter注入

Posted SunnyYoona

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Spring实战系列]Spring注入方式之setter注入相关的知识,希望对你有一定的参考价值。


通常,JavaBean 的属性是私有的,同时拥有一组存取器方法,以setXXX() 和getXXX() 形式存在。Spring 可以借助属性的set方法来配置属性的值,以实现setter方式的注入

1. 注入简单值

在Spring 中我们可以使用<property> 元素配置Bean 的属性。<property>在许多方面都与<constructor-arg> 类似,只不过一个是通过构造参数来注入值,另一个是通过调用属性的setter 方法来注入值。

举例说明,让我们使用setter注入为Student学生赋予一些基本信息,setter注入必须借助setXXX方法来配置属性的值。Student类一共有两个属性,name和age,我们都提供了相应的set方法。
package com.sjf.bean;
 
/**
* 学生实体类
* @author sjf0115
*
*/
public class Student {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
 
public void setAge(int age) {
this.age = age;
}
 
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("个人详细信息如下:" + "\n");
stringBuilder.append("name:" + name + "\n");
stringBuilder.append("age:" + age);
return stringBuilder.toString();
}
}

下面让我们使用setter注入为Student学生赋予一些基本信息,下面的XML展示了Bean 的配置:
<bean id = "yoona" class = "com.sjf.bean.Student">
<property name="name" value = "yoona"/>
<property name="age" value = "24" />
</bean>

一旦Student被实例化,Spring 就会调用<property> 元素所指定属性的setter方法为该属性注入值。在这段XML代码中,<property> 元素会指示Spring 调用setName() 方法将name属性的值设置为“yoona”,调用setAge()方法将age属性的值设为24。注意的是name="xxx"中的xxx必须跟setXXX()方法中XXX是一样的。<property> 元素并没有限制只能注入String 类型的值,value 属性同样可以指定数值型(int、float、java.lang.Double 等)以及boolen 型的值。

注意value 属性的使用,为它设置数字类型的值和设置String 类型的值并没有任何不同。Spring 将根据Bean 属性的类型自动判断value 值的正确类型。因为Bean的age 属性为int 类型,Spring 在调用setAge() 方法之前会自动将字符串“24”转换成int 型。

2. 引用其他Bean

在setter注入中引用其他Bean,跟构造器注入引用其他Bean基本一致,都要借助ref属性来实现。

我们来为Student设置一个学校School类:
public class School {
private String name;
 
public void setName(String name) {
this.name = name;
}
}

private String name;
private int age;
private School school;
public void setName(String name) {
this.name = name;
}
 
public void setAge(int age) {
this.age = age;
}
 
public void setSchool(School school) {
this.school = school;
}

使用之前要我们必须在Spring 中将它声明为一个Bean,同时为学校赋值一个名字西电:
<bean id = "xidian" class = "com.sjf.bean.School">
<property name = "name" value = "西电"/>
</bean>

声明了school之后,那么现在就可以将它赋给Student了。使用setter 注入为school 属性设值:
<bean id = "yoona" class = "com.sjf.bean.Student">
<property name="name" value = "yoona"/>
<property name="age" value = "24" />
<property name="school" ref="xidian"></property>
</bean>
<bean id = "xidian" class = "com.sjf.bean.School">
<property name = "name" value = "西电"/>
</bean>

3. 注入内部Bean


我们已经看到yoona该学生有了考进西电大学。不仅yoona可以考上西电大学,其他学生也可以通过自己的努力考上该大学。所以说不同Student学生)可以共享一个School(学校)。事实上,在应用中与其他Bean 共享Bean是非常普遍的。

<bean id = "yoona" class = "com.sjf.bean.Student">
<property name="name" value = "yoona"/>
<property name="age" value = "24" />
<property name="school" ref="xidian"></property>
</bean>
 
<bean id = "xiaosi" class = "com.sjf.bean.Student">
<property name="name" value = "xiaosi"/>
<property name="age" value = "21" />
<property name="school" ref="xidian"></property>
</bean>