面試官:依賴注入是啥?你懂嗎

IOC DI 這究竟是個啥

hi 各位小夥伴,今天跟你們聊聊控制反轉和依賴注入究竟是個啥?html

在瞭解過程當中看了不少的資料 若是有不正確的但願你們跟我聯繫,一塊兒學習java

本次文章分爲如下三個部分web

  • IOC 和DI 是什麼
  • IOC 和DI帶來的好處
  • java中如何使用IOC和DI

IOC 和DI 是什麼

控制反轉(Inversion of Control,縮寫爲IoC),是面向對象編程中的一種設計原則,能夠用來減低計算機代碼之間的耦合度。其中最多見的方式叫作依賴注入(Dependency Injection,簡稱DI),還有一種方式叫「依賴查找」(Dependency Lookup)。經過控制反轉,對象在被建立的時候,由一個調控系統內全部對象的外界實體,將其所依賴的對象的引用傳遞(注入)給它。spring

控制反轉到底反轉的是什麼,控制的又是什麼,依賴注入 注入的是什麼,依賴的又是什麼?編程

首先讓咱們忘記控制反轉來看依賴注入,由於04年的時候馬丁大叔就控制反轉這個詞語提出一種更加易懂的解釋叫依賴注入,瞭解依賴注入才能更好理解控制反轉。下面經過一個例子來引出依賴注入。函數

每一個文本輸入框有一個文本檢查器,每次初始化一個文本選擇框都須要一個檢查器。學習

public class TextInput {
    private  SpellCheck spellCheck;
    public TextInput() {
        spellCheck=new SpellCheck();
    }
}
複製代碼
public class TextInput {
    private  SpellCheck spellCheck;
    public TextInput(SpellCheck spellCheck) {
        this.spellCheck=spellCheck;
    }
}
複製代碼

觀察以上兩段不一樣的代碼咱們能夠發現他們本質的區別是 SpellCheck對象建立的時間以及地點不一樣,在後面代碼中文本檢查器做爲一個文本框的構造方法中的一個形參傳入文本框內部。便可以瞭解爲將spellCheck對象注入TextInput類。經過這個例子大概就能夠了解上面提出的問題,什麼是依賴,什麼是注入了吧,文本框依賴 檢查器 ,將依賴的類做爲 形參放入依賴的類中 就成爲依賴注入。測試

接下來就是控制反轉了,寫過java web的同窗必定使用過一個註解@Autowired ,經過這個註解就能夠直接生成一個類對象,而不須要顯式 new一個出來。當咱們能夠控制一個對象什麼時候生成時這即是控制,而經過IOC容器將對象的建立權奪走,這即是權力反轉。this

理解了上面的概念,其實你就知道控制反轉是依賴注入的web應用,專門使用一個容器對要注入的類進行管理。方方便了用戶在類外重複建立依賴類。因此深刻了解依賴注入是重點,而控制反轉是DI的應用。如Martin 說的「哪些方面的控制被反轉了?」這個問題。他總結出是依賴對象的得到被反轉了,spa

下面讓咱們來聊聊依賴注入到底有什麼好處,以及依賴注入的幾種方法。

在讓咱們經過代碼來了解他的好處

public class Car {
    private enginer enginer;
    private wheel wheel;

    public Car() {
        enginer = new enginer();
        wheel = new wheel();
    }
}
複製代碼
public class Car {
    private enginer enginer;
    private wheel wheel;

    public Car(enginer enginer, wheel wheel) {
        this.enginer = enginer;
        this.wheel = wheel;
    }
}
複製代碼

汽車是一個複雜對象,其中包括許多的組件,發動機,輪子等等, 各類各樣的汽車老是大同小異,輪子的尺寸,當咱們想要建立兩輛不一樣的車的時候,但他們只有輪子的大小不一樣時 方案1 要建立一個新car類在構造函數中新new 一個wheel對象,而方案二,只須要在外面建立 wheel對象傳入car類就能夠。減小了新建Car類 。也就是說減小了類之間的耦合,對象在運行時而不是在編譯時(汽車製造時)被賦予它們的依賴關係。 因此咱們如今能夠隨時改變車輪。 在這裏,依賴(車輪)能夠注入到汽車在運行時間。同時這是一種很是有用的測試技術,由於它容許對依賴關係進行模擬或刪除。

經過上面你們應該瞭解依賴注入了除了經過構造函數還有哪幾種方式來實現依賴注入呢?

依賴注入有以下實現方式:

  • 基於接口。實現特定接口以供外部容器注入所依賴類型的對象。
  • 基於 set 方法。實現特定屬性的public set方法,來讓外部容器調用傳入所依賴類型的對象。
  • 基於構造函數。實現特定參數的構造函數,在新建對象時傳入所依賴類型的對象。
  • 基於註解。基於Java的註解功能,在私有變量前加「@Autowired」等註解,不須要顯式的定義以上三種代碼,即可以讓外部容器傳入對應的對象。該方案至關於定義了public的set方法,可是由於沒有真正的set方法,從而不會爲了實現依賴注入致使暴露了不應暴露的接口(由於set方法只想讓容器訪問來注入而並不但願其餘依賴此類的對象訪問)。

ok。ioc和di就介紹到這。若是上面有錯誤 請你們及時聯繫我並提出,不勝感謝。

參考文獻

Effective java 第三版

wiki

what is dependency injection

What is Inversion of Control?

DI提出者原文

spring ioc di理解

相關文章
相關標籤/搜索