Spring的依賴注入及三種配置方式(上)
Tommmmm 關注
2018.01.30 14:19 字數 1179 閱讀 133評論 0喜歡 1
爲什麼要引入依賴注入
在解決這個問題前我們要先回答以下幾個問題:
什麼是依賴?
Spring IoC容器的依賴有兩層含義:Bean依賴容器和容器注入Bean的依賴資源:
Bean依賴容器:這裏的依賴是指容器負責創建Bean並管理Bean的生命週期,正是由於由容器來控制創建Bean並注入依賴,也就是控制權被反轉了,這也正是IoC名字的由來,此處的有依賴是指Bean和容器之間的依賴關係。
容器注入Bean的依賴資源:容器負責注入Bean的依賴資源,依賴資源可以是Bean、外部文件、常量數據等,在Java中都反映爲對象,並且由容器負責組裝Bean之間的依賴關係,此處的依賴是指Bean之間的依賴關係,可以認爲是傳統類與類之間的“關聯”、“聚合”、“組合”關係。
什麼是依賴注入?
針對本次的實驗,畫了如下的圖,來大致表示依賴注入。
可以看到,在Spring中,對象的生成不再是通過顯式的new,而且到spring容器裏面取,對象的創建是使用注入這種形式。
image
相比於new一個對象,依賴注入有哪些優勢呢?
比如說有一個訂單的DAO接口:interface OrderDAO
在開發的時候用的MySql數據庫,實現類爲 class MySqlOrderDAOImpl implements OrderDAO
在業務代碼裏面,要使用OrderDAO,這沒什麼難的,直接new一個對象不就行了嗎,於是就這樣:
OrderDAO dao = new MySqlOrderDAOImpl();
輕鬆完成,最後項目完成,實施運營了,後來客戶發現MySql不行了,要換成Oracle,這不難,再寫一個OrderDAO的實現類不就行了嗎:
class OracleOrderDAOImpl implements OrderDAO
可是這樣就又來了一個麻煩就是在業務代碼裏面,都是自己new的對象,都是“MySqlOrderDAOImpl”,
沒問題,把 “MySqlOrderDAOImpl” 替換成”OracleOrderDAOImpl “就可以了
於是,全體動員,查找“MySqlOrderDAOImpl”然後替換成”OracleOrderDAOImpl “,這樣浪費了半天,還可能有些地方還沒替換呢
而如果使用spring的Ioc,在配置文件裏配置OrderDAO的實現類就可以了,只要OrderDAO的有新的實現類,只需要在配置文件中修改一下就可以了,大概需要幾秒鐘吧,時間太快,沒法計算啊。
實例化相比於依賴注入的優點:
優點:快,適用於小項目
缺點:不利於測試,維護、以及多人開發
依賴注入確實很方便,但是如果某個類的實例化需要參數呢?
可以通過構造器注入和屬性注入。
構造器注入
在進行依賴獲取的時候,框架找到待創建類的構造方法,然後根據構造器所需參數的類型或者順序,容器節點中尋找,然後提供參數,創建實例。
屬性注入
同樣的,找到待創建類型的所有屬性,然後根據屬性在容器節點中進行匹配,有則創建提供,無則跳過。
這兩種注入方式將在後面的實驗裏介紹。
爲什麼要引入依賴注入呢?
依賴注入不是目的,它是一系列工具和手段,最終的目的是幫助我們開發出鬆散耦合、可維護、可測試的代碼和程序。
依賴注入讓使用者不需要自己去創建或獲取自己的依賴,既然創建或獲取的過程不是使用者控制的,這也就意味着,當需要切換依賴時,不需要改變使用者的代碼。
可以讓spring去管理對象A。比如在B中使用A很多,哪一天A大量更改,那麼B中就要修改好多代碼。倘若使用spring託管,也就是Ioc。那麼A改它的。只需要在spring配置文件中修改A的相關配置即可。AB間耦合降低了修改代碼的負擔。而且也解耦合,符合軟件工程的思想。
總結來說依賴注入大概有兩個好處:解耦,方便單元測試。
Measure
Measure