4.注入
1.什么是注入
通过spring工厂及配置文件,为锁创建对象成员变量进行赋值
1.1为什么需要
通过硬编码的方法对成员变量进行复制,存在耦合
1.2 如何进行注入
- 为成员变量提供get set方法
- 配置spring的配置文件
<bean id="person" class="com.xxc.basic.Person">
<property name="id">
<value>11</value>
</property>
<property name="name">
<value>xiaoxiao</value>
</property>
</bean>
1.3 好处
解耦合
2.spring注入的原理分析(简易)
spring底层通过调用对象属性的set方法,完成成员变量的赋值,这种方式也被称之为set注入
5.set注入详解
针对不同类型的成员变量在<property>标签中,需要嵌套其他标签
1. JDK内置类型
1.1 String + 8中基本数据类型
<value>xxx</value>
1.2 数组
<property name="emails">
<list>
<value>liucy@163.com</value>
<value>jack@163.com</value>
<value>john@163.com</value>
</list>
</property>
1.3 set集合
<property name="tesl">
<set>
<value>15611111111</value>
<value>13811111111</value>
<value>13811111111</value>
<value>13811111111</value>
<value>19811111111</value>
</set>
</property>
当被赋值的对象没有加泛型时,代表可以存任何对象,即
<set>
<ref bean
<set
</set>
1.4 List集合
<property name="addresses">
<list>
<value>xiaoxiao</value>
<value>chongchong</value>
<value>xiaohua</value>
</list>
</property>
1.5 Map集合
注意:map中嵌套entry,entry中的键有特殊的标签<key></key>,值则需要根据对应类型进行选择
<property name="qqs">
<map>
<entry>
<key><value>xxc</value></key>
<value>11111111</value>
</entry>
<entry>
<key><value>sun</value></key>
<value>22222222</value>
</entry>
</map>
</property>
1.6 properites类型
properties类型是一种特殊的map key---String;value---String
<property name="p">
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
<prop key="key3">value3</prop>
</props>
</property>
1.7 复杂的数据类型
如Data..等
需要自定义类型转换器,就能进行处理
2. 用户自定义类型
2.1 第一种方式
1. 为成员变量提供set get方法
2. 使用配置文件进行注入
<bean id="userService" class="xxx.UserServiceImpl">
<property name="userDAO">
<!-- 该对象只是用一次,并且不会被别人引用时,就可以直接使用class,而不使用id属性 -->
<bean class="xxx.UserDAOImpl"/>
</property>
</bean>
2.2 第二种方式
第一种方式存在的问题:
1. 配置文件代码冗余
2. 被注入的对象,若多次创建,浪费(JVM)资源
1. 为成员变量提供set get方法
2. 使用配置文件进行注入
<bean id="userDAO" class="xxx.UserDAOIpmpl"/>
<bean id="userService" class="xxx.UserServiceImpl">
<ref bean="userDAO"/>
</bean>
在spring4.x 废除了 <ref local=""/> 基本等效与 <ref bean=""/>
区别:local只能引用本配置文件中的bean,但是,bean可以引用父容器的(springMVC)
3.set注入简化写法
3.1 基于属性简化
JDK注入
<property name="name">
<value>xxc</value>
</property>
<property name="name" value="xxc"/>
注意:value只能简化基本数据类型+String
<bean id="userDAO" class="xxx.UserDAOIpmpl"/>
<bean id="userService" class="xxx.UserServiceImpl" ref="userDAO"/>
3.2 基于p命名空间简化
JDK类型注入
<bean id="person" class="com.xxc.basic.Person">
<property name="name">
<value>xxc</value>
</property>
</bean>
<!--变为:-->
<bean id="person" class="com.xxc.basic.Person" p:name="xxc" p:id="123456"/>
注意:value只能简化基本数据类型+String
<bean id="userDAO" class="xxx.UserDAOIpmpl"/>
<bean id="userService1" class="com.xxc.basic.UserServiceImpl">
<property name="userDAO">
<ref bean="userDAO"/>
</property>
</bean>
<!--变为:-->
<bean id="userService2" class="com.xxc.basic.UserServiceImpl" p:userDAO-ref="userDAO"/>
6.构造注入
1. 注入: 通过spring配置文件为成员变量赋值
2. set注入: spring调用set方法,通过配置文件对成员变量进行赋值
3. 构造注入: spring调用构造方法,通过配置文件对成员变量进行赋值
1.开发步骤
1. 提供有参构造
public class Customer implements Serializable {
private String name;
private int age;
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
}
2. spring配置文件进行配置
注意:构造方法有多少参数就有多少<constructor-arg>,并且顺序与构造方法书序一致
<bean id="customer" class="com.xxc.basic.constructer.Customer">
<constructor-arg>
<value>xxc</value>
</constructor-arg>
<constructor-arg>
<value>21</value>
</constructor-arg>
</bean>
2.构造方法重载
2.1 参数个数不同
控制<constructor-arg>标签个数来进行区分
2.2 参数个数相同
通过在标签中引入type属性进行区分 <constructor-arg type="">
3.注入总结
未来实战中,应用set注入还是构造注入?
set注入会更多
1. 构造注入麻烦(重载)
2. spring框架底层,大量使用了set注入