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注⼊