spring学习 注⼊(Injection)
1、什么是注⼊
通过Spring⼯⼚及配置⽂件,为所创建对象的成员变量赋值
1.1 为什么需要注⼊
通过编码的⽅式,为成员变量进⾏赋值,存在耦合
1.2 如何进⾏注⼊[开发步骤]
类的成员变量提供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>
1.3 注⼊好处
解耦合
2、Spring注⼊的原理分析(简易版)
Spring通过底层调⽤对象属性对应的set⽅法,完成成员变量的赋值,这种⽅式我们也称之为set注⼊
3、Set注⼊详解
针对于不同类型的成员变量,在<property>标签,需要嵌套其他标签
<property>
xxxxx
</property>
1. JDK内置类型
1.1 String+8种基本类型
<value>suns</value>
1.2 数组
<list>
<value>[email protected]</value>
<value>[email protected]</value>
<value>[email protected]</value>
</list>
1.3 Set集合
<set>
<value>11111</value>
<value>112222</value>
</set>
1.4 List集合
<list>
<value>11111</value>
<value>2222</value>
</list>
1.5 Map集合
注意: map -- entry -- key有特定的
标签 <key></key>值根据对应类型选择对应类型的标签
<map>
<entry>
<key><value>suns</value></key>
<value>3434334343</value>
</entry>
</map>
1.6 Properites
Properties类型 特殊的Map key=String value=String
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
</props>
1.7 复杂的JDK类型 (Date)
需要程序员⾃定义类型转换器,处理。
2. ⽤户⾃定义类型
2.1 第⼀种⽅式
为成员变量提供set get⽅法
配置⽂件中进⾏注⼊(赋值)
<bean id="userService" class="xxxx.UserServiceImpl">
<property name="userDAO">
<bean class="xxx.UserDAOImpl"/>
</property>
</bean>
2.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. Set注⼊的简化写法
3.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"/>
3.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:userDAO-ref="userDAO"/>
4、构造注⼊
1、注⼊:通过Spring的配置⽂件,为成员变量赋值
2、Set注⼊:Spring调⽤Set⽅法 通过配置⽂件为成员变量赋值
3、构造注⼊: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>
2. 构造⽅法重载
2.1 参数个数不同时
通过控制标签的数量进⾏区分
2.2 构造参数个数相同时
通过在标签引⼊ type属性 进⾏类型的区分
5. 注⼊的总结
未来的实战中,应⽤set注⼊还是构造注⼊?
答案:set注⼊更多
- 构造注⼊麻烦 (重载)
- Spring框架底层 ⼤量应⽤了set注⼊