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 第⼆種⽅式

第⼀種賦值⽅式存在的問題

  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. 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注⼊更多

  1. 構造注⼊麻煩 (重載)
  2. Spring框架底層 ⼤量應⽤了set注⼊
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章