5 分鐘一次理解 Spring IOC !

今天咱們分析一下 spring 的 IOC,梳理一下 IOC 和 DI 的概念與原理。在網上看到開濤有篇文章寫的不錯,提取其中一部分精華內容並作一些解讀。spring

1.1.IOC是什麼?編程

Ioc—Inversion of Control,即「控制反轉」,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味着將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。設計

●誰控制誰,控制什麼:傳統Java SE程序設計,咱們直接在對象內部經過new進行建立對象,是程序主動去建立依賴對象;而IoC是有專門一個容器來建立這些對象,即由Ioc容器來控制對象的建立。對象

解讀:生命週期

提到控制就要理解控制的含義,控制就是對象的建立、初始化、銷燬。建立對象,原來是 new 一個,如今給 Spring 容器建立了;對象初始化,好比 A 依賴 B,原來是咱們經過構造器或者 setter 方法賦值,如今給 Spring 容器自動注入了;銷燬對象,原來是咱們直接賦值 null 或者作一些銷燬操做,如今給 Spring 容器管理生命週期負責銷燬。明白了吧,IOC 解決了繁瑣的對象生命週期的操做,解耦了咱們的代碼。資源

●爲什麼是反轉,哪些方面反轉了:有反轉就有正轉,傳統應用程序是由咱們本身在對象中主動控制去直接獲取依賴對象,也就是正轉;而反轉則是由容器來幫忙建立及注入依賴對象;爲什麼是反轉?由於由容器幫咱們查找及注入依賴對象,對象只是被動的接受依賴對象,因此是反轉;哪些方面反轉了?依賴對象的獲取被反轉了。開發

解讀:io

反轉的是什麼?反轉的是控制權。前面提到 Spring 控制了對象的生命週期,那麼對象的控制就徹底脫離了咱們的控制,交給了 Spring。這個反轉是指,咱們由對象的控制者變成了 IOC 的被動接受者。咱們沒法決定對象生命週期的任何一個階段,最可能是藉助於 Spring 的擴展機制作一些微小的動做,咱們甚至沒法預判依賴的對象真正被注入的是哪個。反轉比如你家的機器人決定了你的生活節奏,必須聽他的。面向對象編程

1.2.IOC能作什麼?程序設計

IoC 不是一種技術,只是一種思想,一個重要的面向對象編程的法則,它能指導咱們設計出鬆耦合、更優良的程序。把建立和查找依賴對象的控制權交給了容器,由容器進行注入組合對象,因此對象與對象之間是鬆散耦合,利於功能複用,更重要的是使得程序的整個體系結構變得很是靈活。

解讀:

藉助 IOC 容器完美解決了耦合問題,甚至可讓八竿子打不着的類型產生注入關係。好比二方包 a 裏面有個類型 A1,三方包 b 裏面有個類型 B1,這兩個都是 readOnly 的,你不可能去建立或修改內部的依賴。可是藉助於 IOC,能夠把咱們本身的類 C1 注入進去,讓 A一、B1 依賴於 C1,從而改變二方包的行爲。這也是大型企業級開發中 IOC 比較常見的用法。

其實IoC對編程帶來的最大改變不是從代碼上,而是從思想上,發生了「主從換位」的變化。應用程序本來是老大,要獲取什麼資源都是主動出擊,可是在IoC/DI思想中,應用程序就變成被動的了,被動的等待IoC容器來建立並注入它所須要的資源了。

解讀:

在 IOC 模式下,設計流程變成了真正的無關業務徹底獨立的流程化設計。你只須要設計良好的流程和依賴,定義出須要什麼,而後把控制權交給 Spring 便可。Spring 給你什麼對象,你就用什麼對象,不要對對象作任何的假設,也不要期待對象有什麼特性,只須要等待 Spring 提供對象便可。控制反轉就像喬布斯的理念,我告訴你你須要什麼。

1.3.IOC和DI

DI—Dependency Injection,即「依賴注入」:組件之間依賴關係由容器在運行期決定,形象的說,即由容器動態的將某個依賴關係注入到組件之中。依賴注入的目的並不是爲軟件系統帶來更多功能,而是爲了提高組件重用的頻率,併爲系統搭建一個靈活、可擴展的平臺。經過依賴注入機制,咱們只須要經過簡單的配置,而無需任何代碼就可指定目標須要的資源,完成自身的業務邏輯,而不須要關心具體的資源來自何處,由誰實現。

解讀:

依賴注入是一種實現,而 IOC 是一種設計思想。從 IOC 到 DI,就是從理論到了實踐。你把依賴交給了容器,容器幫你管理依賴,這就是依賴注入的核心。越是大型的項目,越難以管理依賴關係,開發工做逐漸變化爲一個個節點的開發,而這些節點經過依賴注入關聯起來。依賴注入下降了開發的成本、提升了代碼的複用率、提升了軟件的靈活性,也給軟件開發帶來了挑戰,你根本不知道運行時容器會給你什麼。

理解DI的關鍵是:「誰依賴誰,爲何須要依賴,誰注入誰,注入了什麼」,那咱們來深刻分析一下:

●誰依賴於誰:固然是應用程序依賴於IoC容器;

●爲何須要依賴:應用程序須要IoC容器來提供對象須要的外部資源;

●誰注入誰:很明顯是IoC容器注入應用程序某個對象,應用程序依賴的對象;

●注入了什麼:就是注入某個對象所須要的外部資源(包括對象、資源、常量數據)。

解讀:

DI 即依賴注入,重點就在於 「依賴」、「注入」 兩個概念。什麼是依賴?對象運行所須要的外部的數據、資源就是依賴,沒有這些東西對象不能完成業務處理,必須拿到才能運行。什麼是注入?注入這個詞真的很形象,就像打針同樣,從外部注入到內部,容器加載了外部的文件、URL、配置和對象而後把這些數據、對象按需注入給對象。

IoC和DI由什麼關係呢?其實它們是同一個概念的不一樣角度描述,因爲控制反轉概念比較含糊,因此2004年大師級人物Martin Fowler又給出了一個新的名字:「依賴注入」,相對IoC 而言,「依賴注入」明確描述了「被注入對象依賴IoC容器配置依賴對象」。

解讀:

IOC 和 DI 是同一個概念的不一樣角度描述,但實際上又是有區別的。IOC 強調的是容器和對象的控制權發生了反轉,而 DI 強調的是對象的依賴由容器進行注入,大部分狀況下說二者相同也不算錯。 可是廣義上 IOC 是一種軟件開發模式,也就是說還能夠經過別的方式實現,而 DI 只是其中一種,Spring 選擇了 DI 從而使 DI 在 Java 開發中深刻人心。

關注公衆號「程序之心」(ID:chengxuzhixin),天天給你誠意滿滿的乾貨!

相關文章
相關標籤/搜索