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