Spring5深入浅出篇:Spring对象属性注入详解

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: Spring5深入浅出篇:Spring对象属性注入详解

Spring5深入浅出篇:Spring对象属性注入详解

首先需要了解什么是注入?在创建对象的过程中,不仅仅是创建一个对象还需要为对象的属性赋值.这一系列操作在Spring中,是通过Spring工厂以及配置文件,为所创建的对象的成员变量赋值.

为Spring的对象属性赋值

这里直接上代码

ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
       Person person = (Person) ctx.getBean("person");
       person.setId(1);  //通过代码为成员变量赋值,存在耦合
       person.setName("suns");
       System.out.println("person = " + person);

Spring的注入(开发步骤)

  • 类的成员变量提供set get⽅法
  • 配置spring的配置⽂件
<bean id="person" class="com.baizhiedu.basic.Person">
 <property name="id">
 <value>10</value>
 </property>
 <property name="name">
 <value>xiaojr</value>
 </property>
</bean>

简单来说,这样的注入方式主要就是为了解耦合

Spring注⼊的原理分析(简易版)

Spring通过底层调⽤对象属性对应的set⽅法,完成成员变量的赋值,这种⽅式我们也称之为set注⼊

Set注⼊详解

针对于不同类型的成员变量,在<property>标签,需要嵌套其他标签
<property>
 xxxxx
</property>

JDK内置类型

String+8种基本类型

<value>suns</value>

数组

<list>
 <value>suns@zparkhr.com.cn</value>
 <value>liucy@zparkhr.com.cn</value>
 <value>chenyn@zparkhr.com.cn</value>
</list>

Set集合

<set>
 <value>11111</value>
 <value>112222</value>
</set>
<set>
 <ref bean
 <set
</set>

List集合

<list>
 <value>11111</value>
 <value>2222</value>
</list>
<list>
 <ref bean
 <set
</list>

Map集合

注意: map -- entry -- key有特定的标签 <key></key>
 值根据对应类型选择对应类型的标签
<map>
 <entry>
 <key><value>suns</value></key>
 <value>3434334343</value>
 </entry>
 <entry>
 <key><value>chenyn</value></key>
 <ref bean
 </entry>
</map>

Properites

Properties类型 特殊的Map key=String value=String

<props>
 <prop key="key1">value1</prop>
 <prop key="key2">value2</prop>
</props>

复杂的JDK类型 (Date)

需要程序员⾃定义类型转换器,处理。

⽤户⾃定义类型

第⼀种⽅式

  • 为成员变量提供set get⽅法
  • 配置⽂件中进⾏注⼊(赋值)
<bean id="userService" class="xxxx.UserServiceImpl">
 <property name="userDAO">
 <bean class="xxx.UserDAOImpl"/>
 </property>
</bean>

第二种⽅式

  • 第⼀种赋值⽅式存在的问题
1. 配置⽂件代码冗余
2. 被注⼊的对象(UserDAO),多次创建,浪费(JVM)内存资源
  • 为成员变量提供set get⽅法
  • 配置⽂件中进⾏配置
<bean id="userDAO" class="xxx.UserDAOImpl"/>
<bean id="userService" class="xxx.UserServiceImpl">
 <property name="userDAO">
 <ref bean="userDAO"/>
 </property>
</bean>
#Spring4.x 废除了 <ref local=""/> 基本等效 <ref bean=""/>

Set注⼊的简化写法

基于属性简化

JDK类型注⼊
<property name="name">
 <value>suns</value>
</property>
<property name="name" value="suns"/>
注意:value属性 只能简化 8种基本类型+String 注⼊标签
⽤户⾃定义类型
<property name="userDAO">
 <ref bean="userDAO"/>
</property>
<property name="userDAO" ref="userDAO"/>

基于p命名空间简化

JDK类型注⼊
<bean id="person" class="xxxx.Person">
 <property name="name">
 <value>suns</value>
 </property>
</bean>
<bean id="person" class="xxx.Person" p:name="suns"/>
注意:value属性 只能简化 8种基本类型+String 注⼊标签
⽤户⾃定义类型
<bean id="userService" class="xx.UserServiceImpl">
 <property name="userDAO">
 <ref bean="userDAO"/>
</property>
</bean>
<bean id="userService" class="xxx.UserServiceImpl" p:userDAOref="userDAO"/>

构造注⼊

注⼊:通过Spring的配置⽂件,为成员变量赋值
Set注⼊:Spring调⽤Set⽅法 通过配置⽂件 为成员变量赋值
构造注⼊:Spring调⽤构造⽅法 通过配置⽂件 为成员变量赋值
  • 提供有参构造⽅法
public class Customer implements Serializable {
 private String name;
 private int age;
 public Customer(String name, int age) {
 this.name = name;
 this.age = age;
 }
}
  • Spring的配置⽂件
<bean id="customer"
class="com.baizhiedu.basic.constructer.Customer">
 <constructor-arg>
 <value>suns</value>
 </constructor-arg>
 <constructor-arg>
 <value>102</value>
 </constructor-arg>
</bean>

构造⽅法重载

参数个数不同时通过控制标签的数量进⾏区分

构造参数个数相同时通过在标签引⼊ type属性 进⾏类型的区分

注⼊的总结

未来的实战中,应⽤set注⼊还是构造注⼊?
答案:set注⼊更多
 1. 构造注⼊麻烦 (重载)
 2. Spring框架底层 ⼤量应⽤了 set注⼊

相关文章
|
5天前
|
运维 Java 程序员
Spring5深入浅出篇:Spring切入点详解
该文档是关于Spring框架中切入点的详细解释。切入点是AOP(面向切面编程)的核心概念,用于定义通知(如日志、事务管理)应该附加到代码的哪些位置。文档主要介绍了切入点表达式的不同类型: 1. 方法切入点表达式:使用`execution()`定义匹配的方法,星号`*`代表任意返回值和方法名,`(..)`表示任意参数。 2. 类切入点:指定特定类以应用额外功能,可以精确到类中的所有方法,或者只包含特定包的类。 3. 包切入点表达式:适用于整个包或包及其子包内的所有类和方法。
|
3天前
|
前端开发 Java 编译器
详解Spring与JDK注入
依赖注入是Spring框架的核心概念之一,它通过将对象之间的依赖关系外部化,实现了松耦合和可测试性。面向切面编程则允许开发人员将横切关注点(如日志、事务管理)从应用程序的主要业务逻辑中分离出来,以提高代码的模块化和可维护性。
10 4
|
5天前
|
存储 缓存 Java
【JavaEE】Spring中注解的方式去获取Bean对象
【JavaEE】Spring中注解的方式去获取Bean对象
3 0
|
5天前
|
存储 Java 对象存储
【JavaEE】Spring中注解的方式去存储Bean对象
【JavaEE】Spring中注解的方式去存储Bean对象
9 0
|
5天前
|
存储 Java 对象存储
【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
9 0
|
5天前
|
XML Java 数据格式
Spring 属性注入方式
Spring 属性注入方式
14 2
|
5天前
|
SQL Java 数据库连接
15:MyBatis对象关系与映射结构-Java Spring
15:MyBatis对象关系与映射结构-Java Spring
31 4
|
5天前
|
JSON Java 数据处理
Spring Boot与Jsonson对象:灵活的JSON操作实战
【4月更文挑战第28天】在现代Web应用开发中,JSON数据格式的处理至关重要。假设 "Jsonson" 代表一个类似于Jackson的库,这样的工具在Spring Boot中用于处理JSON。本篇博客将介绍Spring Boot中处理JSON数据的基本概念,并通过实际例子展示如何使用类似Jackson的工具进行数据处理。
28 0
|
5天前
|
Java Spring
Spring⼯⼚创建复杂对象
Spring⼯⼚创建复杂对象
33 11
|
5天前
|
Java Spring 容器
Spring注入
Spring注入
33 13