您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Spring中IOC的原理及好處是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
為什么會有人說設計模式已死呢,因為spring這些框架幫你做好了類和對象的管理,讓你寫代碼的時候只專注于你實現的功能,而不是設計。先來看看設計模式的7大原則:
開放-封閉原則
單一職責原則
依賴倒轉原則
最小知識原則
接口隔離原則
合成/聚合復用原則
里氏代換原則,任何基類可以出現的地方,子類一定可以出現
假設我們設計一輛汽車:先設計輪子,然后根據輪子大小設計底盤,接著根據底盤設計車身,最后根據車身設計好整個汽車。這里就出現了一個“依賴”關系:汽車依賴車身,車身依賴底盤,底盤依賴輪子。
這樣的設計看起來沒問題,但是可維護性卻很低。假設設計完工之后,上司卻突然說根據市場需求的變動,要我們把車子的輪子設計都改大一碼。這下我們就蛋疼了:因為我們是根據輪子的尺寸設計的底盤,輪子的尺寸一改,底盤的設計就得修改;同樣因為我們是根據底盤設計的車身,那么車身也得改,同理汽車設計也得改——整個設計幾乎都得改!我們現在換一種思路。我們先設計汽車的大概樣子,然后根據汽車的樣子來設計車身,根據車身來設計底盤,最后根據底盤來設計輪子。這時候,依賴關系就倒置過來了:輪子依賴底盤, 底盤依賴車身, 車身依賴汽車。
上司再說要改動輪子的設計,我們就只需要改動輪子的設計,而不需要動底盤,車身,汽車的設計了。這就是依賴倒置原則——把原本的高層建筑依賴底層建筑“倒置”過來,變成底層建筑依賴高層建筑。高層建筑決定需要什么,底層去實現這樣的需求,但是高層并不用管底層是怎么實現的。這樣就不會出現前面的“牽一發動全身”的情況。
就是依賴倒置原則的一種代碼設計的思路。具體采用的方法就是所謂的依賴注入(Dependency Injection)。其實這些概念初次接觸都會感到云里霧里的。說穿了,
為了理解這幾個概念,我們還是用上面汽車的例子。只不過這次換成代碼。我們先定義四個Class,車,車身,底盤,輪胎。然后初始化這輛車,最后跑這輛車。
這樣,就相當于上面第一個例子,上層建筑依賴下層建筑——每一個類的構造函數都直接調用了底層代碼的構造函數。假設我們需要改動一下輪胎(Tire)類,把它的尺寸變成動態的,而不是一直都是30。
由于我們修改了輪胎的定義,為了讓整個程序正常運行,我們需要做一下改動
僅僅是為了修改輪胎的構造函數,這種設計卻需要修改整個上層所有類的構造函數!在軟件工程中,這樣的設計幾乎是不可維護的——在實際工程項目中,有的類可能會是幾千個類的底層,如果每次修改這個類,我們都要修改所有以它作為依賴的類,那軟件的維護成本就太高了。所以我們需要進行控制反轉(IoC),及上層控制下層,而不是下層控制著上層。我們用依賴注入(Dependency Injection)這種方式來實現控制反轉。所謂依賴注入,就是把底層類作為參數傳入上層類,實現上層類對下層類的“控制”。這里我們用構造方法傳遞的依賴注入方式重新寫車類的定義。
這里我們再把輪胎尺寸變成動態的,同樣為了讓整個系統順利運行,我們需要做修改。
只需要修改輪胎類就行了,不用修改其他任何上層類。這顯然是更容易維護的代碼。不僅如此,在實際的工程中,這種設計模式還有利于不同組的協同合作和單元測試:比如開發這四個類的分別是四個不同的組,那么只要定義好了接口,四個不同的組可以同時進行開發而不相互受限制;而對于單元測試,如果我們要寫Car類的單元測試,就只需要Mock一下Framework類傳入Car就行了,而不用把Framework, Bottom, Tire全部new一遍再來構造Car。這里我們是采用的構造函數傳入的方式進行的依賴注入。其實還有另外兩種方法:Setter傳遞和接口傳遞。這里就不多講了,核心思路都是一樣的,都是為了實現控制反轉。
其實上面的例子中,對車類進行初始化的那段代碼發生的地方,就是控制反轉容器。
顯然你也應該觀察到了,因為采用了依賴注入,在初始化的過程中就不可避免的會寫大量的new。這里IoC容器就解決了這個問題。這個容器可以自動對你的代碼進行初始化,你只需要維護一個Configuration(可以是xml可以是一段代碼),而不用每次初始化一輛車都要親手去寫那一大段初始化的代碼。這是引入IoC Container的第一個好處。IoC Container的第二個好處是:我們在創建實例的時候不需要了解其中的細節。在上面的例子中,我們自己手動創建一個車instance時候,是從底層往上層new的。
關于Spring中IOC的原理及好處是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。