控制反轉/依賴注入的好處:
控制反轉(Inversion of Control) 就是依賴倒置原則的一種代碼設計的思路。具體采用的方法就是所謂的依賴注入(Dependency Injection)。
傳統的思想:
先定義四個Class,車,車身,底盤,輪胎。然后初始化這輛車,最后跑這輛車。代碼結構如下:
假設我們需要改動一下輪胎(Tire)類,把它的尺寸變成動態的,而不是一直都是30。我們需要這樣改:
為了讓整個程序正常運行,我們需要做以下改動:
由此我們可以看到,僅僅是為了修改輪胎的構造函數,這種設計卻需要修改整個上層所有類的構造函數!
所以我們需要進行控制反轉(IoC),及上層控制下層,而不是下層控制着上層。我們用依賴注入(Dependency Injection)這種方式來實現控制反轉。所謂依賴注入,就是把底層類作為參數傳入上層類,實現上層類對下層類的“控制”。這里我們用構造方法傳遞的依賴注入方式重新寫車類的定義:
這里我們再把輪胎尺寸變成動態的,同樣為了讓整個系統順利運行,我們需要做如下修改:
這里我只需要修改輪胎類就行了,不用修改其他任何上層類。這顯然是更容易維護的代碼。
什么是控制反轉容器(IoC Container)呢?其實上面的例子中,對車類進行初始化的那段代碼發生的地方,就是控制反轉容器。
我的理解就是IOC容器就是xml的配置里對每個class的屬性的配置,在xml里配置好class需要的類也就是bean
這個容器可以自動對你的代碼進行初始化,你只需要維護一個Configuration(可以是xml可以是一段代碼),而不用每次初始化一輛車都要親手去寫那一大段初始化的代碼。這是引入IoC Container的第一個好處。
IoC Container的第二個好處是:我們在創建實例的時候不需要了解其中的細節。
IoC Container在進行這個工作的時候是反過來的,它先從最上層開始往下找依賴關系,到達最底層之后再往上一步一步new:
IoC Container可以直接隱藏具體的創建實例的細節,在我們來看它就像一個工廠: