IOC 和 DI 是什么
控制反轉(Inversion of Control,縮寫為 IoC),是 面向物件編程 中的一種設計原則,可以用來減低計算機代碼之間的 耦合度 ,其中最常見的方式叫做依賴注入(Dependency Injection,簡稱 DI),還有一種方式叫“依賴查找”(Dependency Lookup),通過控制反轉,物件在被創建的時候,由一個調控系統內所有物件的外界物體,將其所依賴的物件的參考傳遞(注入)給它,
控制反轉到底反轉的是什么,控制的又是什么,依賴注入 注入的是什么,依賴的又是什么?
首先讓我們忘記控制反轉來看依賴注入,因為 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 容器將物件的創建權奪走,這便是權力反轉(可以理解為呼叫代碼的變更頻率切換到被呼叫代碼那里),
理解了上面的概念,其實你就知道控制反轉是依賴注入的 web 應用,專門使用一個容器對要注入的類進行管理,方方便了用戶在類外重復創建依賴類,所以深入了解依賴注入是重點,而控制反轉是 DI 的應用,如 Martin 說的“哪些方面的控制被反轉了?”這個問題,他總結出是依賴物件的獲得被反轉了,
下面讓我們來聊聊依賴注入到底有什么好處,以及依賴注入的幾種方法,
在讓我們通過代碼來了解他的好處
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 第三版 wikiwhat is dependency injectionWhat is Inversion of Control?DI 提出者原文 spring ioc di 理解
參考:
https://juejin.cn/post/6844904071657160717
https://www.cnblogs.com/maigy/p/10808308.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/258709.html
標籤:java
下一篇:aliyun-oss-02
