[Spring实战系列](8)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>
<bean id = "xidian" class = "com.sjf.bean.School">
<property name = "name" value = "西电"/>
</bean>

但是当我们说个人兴趣的时候,就不能与其他人共享了,每一个人都有自己的兴趣喜好,我们将使用一种很好用的Spring 技术: 内部Bean(inner bean)内部Bean 是定义在其他Bean 内部的Bean。

    
    
package com.sjf.bean;
 
public class Hobby {
private String desc;
 
public void setDesc(String desc) {
this.desc = desc;
}
 
@Override
public String toString() {
return desc;
}
}

    
    
package com.sjf.bean;
 
/**
* 学生实体类
* @author sjf0115
*
*/
public class Student {
private String name;
private int age;
private Hobby hobby;
public void setName(String name) {
this.name = name;
}
 
public void setAge(int age) {
this.age = age;
}
public void setHobby(Hobby hobby) {
this.hobby = hobby;
}
 
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("个人详细信息如下:" + "\n");
stringBuilder.append("name:" + name + "\n");
stringBuilder.append("age:" + age + "\n");
stringBuilder.append("hobby:" + hobby.toString());
return stringBuilder.toString();
}
}

进行如下配置,我们把Hobby声明为内部Bean:
    
    
<bean id = "yoona" class = "com.sjf.bean.Student">
<property name="name" value = "xiaosi"/>
<property name="age" value = "21" />
<property name="hobby">
<bean class = "com.sjf.bean.Hobby">
<property name="desc" value = "喜欢踢足球,打羽毛球"/>
</bean>
</property>
</bean>

正如你所见到的,内部Bean 是通过直接 声明一个<bean> 元素作为<property>元素的子节点而定义的。 内部Bean 并不仅限于setter 注入,我们还可以把内部Bean 装配到构造方法的入参中。

注意到内部Bean 没有ID 属性。虽然为内部Bean 配置一个ID 属性是完全合法的,但是并没有太大必要,因为我们永远不会通过名字来引用内部Bean。这也突出了使用内部Bean 的最大缺点:它们 不能被复用内部Bean 仅适用于一次注入,而且也不能被其他Bean 所引用


参考:《Spring实战》


  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@SmartSi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值