我們常在框架開發過程中聽說依賴倒置、依賴反轉、控制反轉、依賴注入、IOC一些名詞,我們常聽的這些名詞和開發設計原則中的依賴反轉原則是有關係,我們來看看這幾個名詞:
控制反轉(IOC),這是Spring面試基本上都會問的一個問題,IOC全名為Inversion of Controller,IOC不一定是Spring的特性,Spring是用IOC的一個基礎架構;簡單理解就是之前透過簡單的方法把業務程式碼冗餘在一起,需要改的時候比較麻煩,權限完全由開發者控制,反正意思是透過一些設計模式讓開發者不在關係基礎開發,只要實現應該實現的功能,權限交由程式控制;
依賴注入(DI),全稱為Dependency Injection,簡單理解就是需要操作的物件透過建構方法、get/set、介面建構的對象,透過外部傳入的物件注入新的對象,這個就是依賴注入,Spring就是運用比較好的一個框架;
依賴反轉原則(DIP),全稱為Dependency Inversion Principle,也可以叫依賴倒置原則,意思是:高層模組(high-level modules )不要依賴低層模組(low-level)。高層模組和低層模組應該透過抽象(abstractions)來互相依賴。除此之外,抽象(abstractions)不要依賴具體實作細節(details),具體實作細節(details)依賴抽象(abstractions);
在呼叫鏈上,呼叫者屬於高層,被呼叫者屬於低層。為什麼會用這樣一個設計呢,追根溯本就是松耦合,不然高模組強綁定低模組,也不會因為底層模組的程式碼而影響高層模組;但是在實際場景中是否完全有必要遵守這一規則呢?讓我們來看一個常見的例子:
MVC架構:常用的使用方式Controller-->Service-->Dao,Controller對應Service來說就是高模組,Service對Dao來說也是高模組,但是我們在實際業務場景中直接透過注入的形式開發,當然有的也可能不會直接注入,透過介面的形式來獲取對象,這樣帶來的工作成本就會增加。 那我們會有一個疑問,使用這個原則會帶來工作成本的增加嗎?按照我的理解話模組也應該是需要劃分一個粒度,也需要分為模組間關係、程式碼間關鍵、基礎框架設計關係、業務程式碼關係,我們要去考慮擴展性,如果來說業務基本上不會怎麼擴展,完全沒有必要用到這原則。 好萊塢原則好萊塢原則簡稱Don‘t call us, we‘ll call you,科普下在好萊塢,把簡歷遞交給演藝公司後就只有回家等待。由演藝公司對整個娛樂項目的完全控制,演員只能被動式的接受公司的差使,在需要的環節中,完成自己的演出。這和我們的依賴倒置原則不謀而合,所有依賴倒置原則也就叫好萊塢原則。 好萊塢原則的具體體現是模板方法模式,所有的元件都是被動的,所有的元件初始化和呼叫都由容器負責。這也是一個基礎框架應該考慮的點,主要有以下好處:Spring IOC 容器來負責物件的生命週期和物件之間的關係
Spring IOC被注入物件提供被依賴物件也有以下幾種方式:建構方法注入、stter方法注入、介面注入。 建構器注入建構器注入,顧名思義就是被注入的物件透過在其建構方法中宣告依賴物件的參數列表,讓外部知道它需要哪些依賴物件。構造器注入比較簡單,透過構造方式構造完成之後就完全可以使用。<code>TestBean(Test test){<br> this.test = test;<br>}</code>
對於 JavaBean 物件而言,我們通常都是透過 getter 和 setter 方法來存取和設定物件的屬性。所以,目前物件只需要為其所依賴的物件提供相對應的 setter 方法,就可以透過該方法將對應的依賴物件設定到被注入物件中。相較於構造器注入,setter 方式註入會顯得比較寬鬆靈活些,它可以在任何時候進行注入
<code>public class TestBean {<br><br> private Test test;<br><br> public void setTestBean(Test test) {<br> this.test = test;<br> }<br>}</code>
接口方式註顯得比較霸道,因為它需要被依賴的物件實現不必要的接口,所以我們要合理地去使用這種場景,一般在基礎框架中很少存在,在業務領域就用的比較多了。
現在Spring主流注入方式主要透過註解去做實現,都是基於元註解@Component去實現,也就與@Component產生很多派生註解。
<code>@Autowrited<br>private TestBean testBean;<br><br>@Component<br>public TestBean(){<br><br>}<br></code>
以上是Java設計原則的依賴倒置是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!