[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>
以上是关于[Spring实战系列]Spring注入方式之setter注入的主要内容,如果未能解决你的问题,请参考以下文章Java实战之03Spring-02Spring的核心之IoC
Spring 从入门到精通系列 05——Spring 依赖注入的三种方式
spring4.1.8扩展实战之六:注册bean到spring容器(BeanDefinitionRegistryPostProcessor接口)