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

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50631178 通常,JavaBean 的属性是私有的,同时拥有一组存取器方法,以setXXX() 和getXXX() 形式存在。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50631178


通常,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实战》


目录
相关文章
|
1月前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
1月前
|
Java 测试技术 程序员
为什么Spring不推荐@Autowired用于字段注入?
作为Java程序员,Spring框架在日常开发中使用频繁,其依赖注入机制带来了极大的便利。然而,尽管@Autowired注解简化了依赖注入,Spring官方却不推荐在字段上使用它。本文将探讨字段注入的现状及其存在的问题,如难以进行单元测试、违反单一职责原则及易引发NPE等,并介绍为何Spring推荐构造器注入,包括增强代码可读性和维护性、方便单元测试以及避免NPE等问题。通过示例代码展示如何将字段注入重构为构造器注入,提高代码质量。
|
1月前
|
自然语言处理 Java API
Spring Boot 接入大模型实战:通义千问赋能智能应用快速构建
【10月更文挑战第23天】在人工智能(AI)技术飞速发展的今天,大模型如通义千问(阿里云推出的生成式对话引擎)等已成为推动智能应用创新的重要力量。然而,对于许多开发者而言,如何高效、便捷地接入这些大模型并构建出功能丰富的智能应用仍是一个挑战。
131 6
|
1月前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
85 2
|
1月前
|
Java 数据库连接 Spring
【2021Spring编程实战笔记】Spring开发分享~(下)
【2021Spring编程实战笔记】Spring开发分享~(下)
28 1
|
1月前
|
缓存 Java Spring
源码解读:Spring如何解决构造器注入的循环依赖?
本文详细探讨了Spring框架中的循环依赖问题,包括构造器注入和字段注入两种情况,并重点分析了构造器注入循环依赖的解决方案。文章通过具体示例展示了循环依赖的错误信息及常见场景,提出了三种解决方法:重构代码、使用字段依赖注入以及使用`@Lazy`注解。其中,`@Lazy`注解通过延迟初始化和动态代理机制有效解决了循环依赖问题。作者建议优先使用`@Lazy`注解,并提供了详细的源码解析和调试截图,帮助读者深入理解其实现机制。
41 1
|
1月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
71 0
|
1月前
|
XML Java 数据库连接
【2020Spring编程实战笔记】Spring开发分享~(上)
【2020Spring编程实战笔记】Spring开发分享~
53 0
|
Java Spring
Spring——setter方式注入和构造函数方式注入
     先写一个比较常见的结构:            其中UserDao跟UserManagerImpl是层与层之间的接口。       下面用这些类来演示setter方式注入跟构造函数注入来解决Manager层注入Dao问题。
1376 0
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
下一篇
无影云桌面