Spring的依賴注入及三種配置方式(上)

原文鏈接:https://www.jianshu.com/p/b72c2932e658

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章