您的“關注”和“點贊”,是信任,是認可,是支持,是動力......
如意見相佐,可留言。
本人必將竭盡全力試圖做到准確和全面,終其一生進行修改補充更新。
目錄
1 Spring 基於自動裝配的依賴注入概述
其他依賴注入的方式請參見博文《Spring 依賴注入(DI)詳解 》。
Spring 為我們提供了一個自動裝配的機制。操作概述如下所示:
- 在類中提供依賴對象的
setter
方法,依賴項為setter
方法參數。constructor
模式不需要,因為依賴項是構造器參數。 - 在 Spring 的配置文件中定義 Bean 時,
<bean>
標簽有一個autowire
屬性,autowire屬性值有 6 種,接下來會逐一進行介紹。可以通過這個屬性來讓 Spring 容器為接受管理的 Bean 自動注入依賴對象。
例如:<bean id="標識名" class="全限定類名" autowire="autowire屬性值"/>
如以上操作,就可以完成自動裝配,就不用在配置文件中使用<property>
標簽或<constructor-arg>
標簽來描述 Bean 之間的依賴關系了。Spring 容器會自動建立 Bean 之間的依賴關系。
有效的解決了配置文件可能會出現“臃腫”的問題,使代碼整潔、美觀。
autowire屬性值
有如下 6 種(也可叫做 6 種自動裝配模式):
no
:默認的設置,表示不啟用自動裝配。需要顯式裝配 Bean。byName
:按名稱自動裝配。可以這么來理解,Spring 容器在管理一個類時,在配置文件中添加 Bean 的autowire
屬性,並把屬性值設置為byName
;在 Java 代碼中對應的有一個類,類中得有setXxx(依賴項參數)
方法。Spring 容器會嘗試將它的屬性(指的是依賴項參數)與配置文件中其他定義為相同名稱(id值 或 name值)的 Bean 進行匹配,如果找到匹配項,Spring 容器會將這些 Bean 實例注入到擁有autowire=byName
屬性的 Bean 中。如果沒匹配成功,將拋出異常,依賴項參數為null
。byType
:按類型自動裝配。可以這么來理解,Spring 容器在管理一個類時,在配置文件中添加 Bean 的autowire
屬性,並把屬性值設置為byType
;在 Java 代碼中對應的有一個類,類中得有setXxx(依賴項參數)
方法。Spring 容器會嘗試將它的屬性(指的是依賴項參數)類型與配置文件中其他定義為相同類型(class值)的 Bean 進行匹配,如果找到不止一個匹配項,將拋出異常;如果沒有找到匹配項,依賴項參數為null
。constructor
:與 byType 模式相似,不同之處在與它應用於構造器參數(依賴項),如果在容器中沒有找到與構造器參數類型一致的 Bean,那么將拋出異常。(其實就是根據構造器參數的數據類型,進行 byType 模式的自動裝配。)autodetect
:通過 Bean 類的自省機制(introspection)來決定是使用constructor
模式還是byType
模式進行自動裝配。Spring 首先嘗試通過constructor
的模式自動裝配,如果它不執行;Spring 再嘗試通過byType
的模式來自動裝配。default
:設置上級標簽<beans>
的default-autowire
屬性定義裝配模式。
2 自動裝配的局限性
- 不是所有類型都可以使用自動裝配,不能自動裝配的數據類型有:Object、基本數據類型(Date、CharSequence、Number、URI、URL、Class、String)等等。
- 自動裝配不如顯示裝配精確,如果可能的話盡量使用顯式裝配。
3 案例實操,走你
主要演示byName
、byType
和constructor
三種模式,因為學會了這三種,其他的模式也都能搞定了。
3.1 案例:byName 模式
第一步:創建Teacher
類。內容如下圖所示:
第二步:創建Staff
類。內容如下圖所示:
第三步:創建配置文件。內容如下所示:
第四步:創建測試類和 JUnit 運行測試。內容如下圖所示:
3.2 案例:byType 模式
第一步:創建Teacher
類。內容如下圖所示:
第二步:創建Staff
類。內容如下圖所示:
第三步:創建配置文件。內容如下所示:
第四步:創建測試類和 JUnit 運行測試。內容如下圖所示:
3.3 案例:constructor 模式
第一步:創建Teacher
類。內容如下圖所示:
第二步:創建Staff
類。內容如下圖所示:
第三步:創建配置文件。內容如下所示:
第四步:創建測試類和 JUnit 運行測試。內容如下圖所示: