第三章 3.1 DI配置及使用 --《跟我學Spring》筆記 張開濤
前邊IoC一章我們已經瞭解了Bean依賴容器,那容器如何注入Bean的依賴資源,
Spring IoC容器注入依賴資源主要有以下兩種基本實現方式:
-
構造器注入:就是容器例項化Bean時注入那些依賴,通過在在Bean定義中指定構造器引數進行注入依賴,包括例項工廠方法引數注入依賴,但靜態工廠方法引數不允許注入依賴;
-
setter注入:通過setter方法進行注入依賴;
-
方法注入:能通過配置方式替換掉Bean方法,也就是通過配置改變Bean方法 功能。
構造器注入
構造器注入可以根據引數索引注入、引數型別注入或Spring3支援的引數名注入。
使用構造器注入通過配置構造器引數實現,構造器引數就是依賴。除了構造器方式,還有靜態工廠、例項工廠方法 可以進行構造器注入。
構造器注入 實現介面例項化(依賴注入例項化)與傳統例項化的區別*:
可以根據 索引,引數型別,引數名字 三種方式注入
____________________________________________________________________________
例項
讓我們來用具體的例子來看一下構造器注入怎麼使用吧。
(1)首先準備Bean類,在此我們就使用“HelloImpl3”這個類。(Bean類)
(2)有了Bean類,接下來要進行Bean定義配置,我們需要配置三個Bean來完成上述三種依賴注入測試,其中Bean ”byIndex”是通過索引注入依賴;Bean ”byType”是根據型別進行注入
構造器注入
靜態工廠方法注入和例項工廠注入
測試程式碼和構造器方式完全一樣,只是配置檔案不一樣,大家只需把測試檔案改一下就可以了。還有一點需 要大家注意就是靜態工廠方式和例項工廠方式根據引數名字注入的方式只支援通過在class檔案中新增“變數除錯資訊” 方式才能執行,ConstructorProperties註解方式不能工作,它只對構造器方式起作用,不建議使用根據引數名進行構 造器注入。
____________________________________________________________________________
setter注入**
在通過構造器、靜態工廠或例項工廠例項好Bean後,
通過呼叫Bean類的setter方法進行注入依賴,
(property name=“ ” value=“ ” )的形式
setter注入方式:
setter注入方式只有一種根據setter名字進行注入:
例項
(2)配置Bean定義,具體配置檔案(setterDependencyInject.xml)片段如下:
知道如何配置了,但Spring如何知道setter方法?如何將值注入進去的呢?
其實方法名是要遵守約定的,setter注 入的方法名要遵循“JavaBean getter/setter 方法命名約定”:
JavaBean:是本質就是一個POJO類,但具有一下限制:
-
該類必須要有公共的無參構造器,如public HelloImpl4() {};
-
屬性為private訪問級別,不建議public,如private String message;
-
屬性必要時通過一組setter(修改器)和getter(訪問器)方法來訪問;
-
setter方法,以“set” 開頭,後跟首字母大寫的屬性名,如“setMesssage”,簡單屬性一般只有一個方法參 數,方法返回值通常為“void”;
-
getter方法,一般屬性以“get”開頭,對於boolean型別一般以“is”開頭,後跟首字母大寫的屬性名,如 “getMesssage”,“isOk”;
___________________________________________________________________________
注入常量
注入常量是依賴注入中最簡單的。配置方式如下所示:
以上兩種方式都可以,從配置來看第一種更簡潔。注意此處“value”中指定的全是字串,由Spring容器將此字 符串轉換成屬性所需要的型別,如果轉換出錯,將丟擲相應的異常。
Spring容器目前能對各種基本型別把配置的String引數轉換為需要的型別。
注:Spring型別轉換系統對於boolean型別進行了容錯處理,除了可以使用“true/false”標準的Java值進行注入,還 能使用“yes/no”、“on/off”、“1/0”來代表“真/假”,所以大家在學習或工作中遇到這種類似問題不要覺得是人 家配置錯了,而是Spring容錯做的非常好
注入集合、陣列和字典
Spring不僅能注入簡單型別資料,還能注入集合(Collection、無序集合Set、有序集合List)型別、陣列(Array)類 型、字典(Map)型別資料、Properties型別資料,接下來就讓我們一個個看看如何注入這些資料型別的資料。
一、注入集合型別:包括Collection型別、Set型別、List型別資料:
(1)List型別:需要使用<list>標籤來配置注入,其具體配置如下:
測試:
(2)Set型別:需要使用<set>標籤來配置注入,其配置引數及含義和<lsit>標籤完全一樣,在此就不闡述了:
二、注入陣列型別:需要使用<array>標籤來配置注入,其中標籤屬性“value-type”和“merge”和<list>標籤含義 完全一樣,具體配置如下:
三、注入字典(Map)型別:字典型別是包含鍵值對資料的資料結構,需要使用<map>標籤來配置注入,其屬性 “key-type”和“value-type”分別指定“鍵”和“值”的資料型別,其含義和<list>標籤的“value-type”含義一 樣,在此就不羅嗦了,並使用<key>子標籤來指定鍵資料,<value>子標籤來指定鍵對應的值資料,具體配置如下:
___________________________________________________________________________
引用其它Bean
上邊章節已經介紹了注入常量、集合等基本資料型別和集合資料型別,本小節將介紹注入依賴Bean及注入內部 Bean。
引用其他Bean的步驟與注入常量的步驟一樣,可以通過構造器注入及setter注入引用其他Bean,只是引用其他 Bean的注入配置稍微變化了一下:
可以將“<constructor-arg index="0" value="Hello World!"/>”和“<property name="message" value="Hello World!"/>”中的value屬性替換成bean屬性,其中bean屬性指定配置檔案中的其 他Bean的id或別名。另一種是把<value>標籤替換為<.ref bean=”beanName”>,bean屬性也是指定配置檔案中的 其他Bean的id或別名。那讓我們看一下具體配置吧:
一、構造器注入方式:
(1)通過” <constructor-arg>”標籤的ref屬性來引用其他Bean,這是最簡化的配置:(此方法簡單)
(2)通過” <constructor-arg>”標籤的子<ref>標籤來引用其他Bean,使用bean屬性來指定引用的Bean:
二、setter注入方式:
____________________________________________________________________________
配置簡寫
讓我們來總結一下依賴注入配置及簡寫形式,其實我們已經在以上部分穿插著進行簡化配置了:
一、構造器注入:
1)常量值
簡寫:<constructor-arg index="0" value="常量"/>
全寫:<constructor-arg index="0"><value>常量</value></constructor-arg>
2)引用
簡寫:<constructor-arg index="0" ref="引用"/>
全寫:<constructor-arg index="0"><ref bean="引用"/></constructor-arg>
二、setter注入:
1)常量值
簡寫:<property name="message" value="常量"/>
全寫:<property name="message"><value>常量</value></ property>
2)引用
簡寫:<property name="message" ref="引用"/>
全寫:<property name="message"><ref bean="引用"/></ property>
3)陣列:<array>沒有簡寫形式
4)列表:<list>沒有簡寫形式
5)集合:<set>沒有簡寫形式
6)字典
簡寫:<map>
<entry key="鍵常量" value="值常量"/>
<entry key-ref="鍵引用" value-ref="值引用"/>
</map>
全寫:<map>
<entry><key><value>鍵常量</value></key><value>值常量</value></entry>
<entry><key><ref bean="鍵引用"/></key><ref bean="值引用"/></entry>
</map>
7)Properties:沒有簡寫形式
三、使用p名稱空間簡化setter注入:
使用p名稱空間來簡化setter注入,具體使用如下:
• xmlns:p="http://www.springframework.org/schema/p" :首先指定p名稱空間;
• <bean id="……" class="……" p:id="value"/> :常量setter注入方式,其等價於<property name="id" value="value"/>;
▪ <bean id="……" class="……" p:id-ref="bean1"/> :引用setter注入方式,其等價於<property name="id" ref="bean1"/>。