1、什么是注入
通过Spring工厂及配置文件,为所创建对象的成员变量赋值
1.1、为什么需要注入
通过编码的方式,为成员变量赋值,存在耦合
1.2、如何进行注入【开发步骤】
- 类的成员变量提供get set方法
- 配置spring的配置文件
<bean id="person" class="cn.edu.njtech.Person">
<property name="id">
<value>10</value>
</property>
<property name="name">
<value>xiaojr</value>
</property>
</bean>
1.3、注入的好处
解耦合
2、Spring注入的原理分析(简易版)
Spring通过底层调用对象属性对应的set方法,完成成员变量的赋值,这种方式我们也称之为set注入
3、Set注入详解
针对于不同类型的成员变量,在<property>标签,需要嵌套其他标签
<property>
xxxxx
</property>
3.1、JDK内置类型
1. String+8中基本类型
<value>suns</value>
2. 数组
<list>
<value>jdq8576@126.com</value>
<value>202061220075@njtech.edu.cn</value>
</list>
3. Set集合
<set>
<value>11111</value>
<value>112222</value>
</set>
<set>
<ref bean
<set
</set>
4. List集合
<list>
<value>11111</value>
<value>2222</value>
</list>
<list>
<ref bean
<set
</list>
5. 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>
6. Properties
Properties类型 特殊的Map key=String value=String
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
</props>
7. 复杂的JDK类型(Date)
需要程序员自定义类型转化器 处理。
3.2、用户自定义类型
1. 第一种方式
-
为成员变量提供get set方法
-
配置文件进行注入(配置)
<bean id="userService" class="xxxx.UserServiceImpl"> <property name="userDAO"> <bean class="xxx.UserDAOImpl"/> </property> </bean>
2. 第二种方式
-
第一种赋值方式存在的问题
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=""/>3.3、Set注入的简化写法
1. 基于属性简化
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"/>2.基于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"/>
4、构造注入
注⼊:通过Spring的配置⽂件,为成员变量赋值
Set注⼊:Spring调⽤Set⽅法 通过配置⽂件 为成员变量赋值
构造注⼊:Spring调⽤构造⽅法 通过配置⽂件 为成员变量赋值
4.1、开发步骤
-
提供有参构造方法
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>
4.2、构造方法重载
1. 参数个数不同时
通过控制<constructor-arg>标签的数量进行区分
2.构造参数个数相同时
通过在标签引⼊ type属性 进⾏类型的区分 <constructor-arg type="">
5、注入的总结
未来的实战中,应⽤set注⼊还是构造注⼊?
答案:set注⼊更多
1. 构造注⼊麻烦 (重载)
2. Spring框架底层 ⼤量应⽤了 set注⼊