1. 程式人生 > >控制反轉(IoC)以及依賴注入(DI)的解釋

控制反轉(IoC)以及依賴注入(DI)的解釋

理解IoC和DI對於Spring的初學者來說是很重要的.

剛開始接觸到這兩個詞感覺過於抽象實在難懂,會有很多問題產生,什麼叫反轉?什麼是依賴關係,啥又叫注入?

程式設計師都是懶惰和高冷的

記住這句話,因此一個純粹的程式設計師都會想方設法讓自己的程式碼變得簡潔,並且後期修改的時候花費少量的精力,同時不是自己的事理都不理。

靈感都來源於生活,所以先用生活中的例子來解釋所謂的"控制反轉"和"依賴注入".

Ioc—Inversion of Control,即"控制反轉"

既然有反轉,那麼正轉又是什麼呢?比如你現在是剛起步的小公司的boss,你現在需要找java工程師,現在找職員的控制權在你的手上,你找到一個Mr.zz給你打工。那麼你和Mr.zz就產生了依賴關係(你當然要依賴Mr.zz給你搞事情啊),一段時間後Mr.zz掛了,你又得自己去找一個Mr.xx.

這就是所謂正轉,在程式設計中,就是指程式主動的去建立依賴物件(你主動的去找Mr.zz).

此時身為boss的你就暴躁了,我才是老大,為啥要我親自找人搞事情啊。於是你找到一箇中介,他負責給你找你想要的人,掛了就找他換,你再也不用操心職員的事情,也就是說你把找職員的控制權反而交給中介去處理。這就叫控制反轉,這樣也能很好的理解好萊塢法則"Don't call us,we will call you."(不要去找職員們,他們會自動來找你).即告訴開發者不要主動去構建依賴物件,而是在需要的時候由依賴注入容器把物件提供過來

DI—Dependency Injection,即"依賴注入"

依賴注入實際上是控制反轉的另一種體現,不同角度的說法而已,中介啥時候找工程師,怎麼找工程師,我都不需要知道。當我需要的時候就聯絡中介,中介就給我一個我需要的職員。

拿操作資料庫來說:比如物件A需要操作資料庫,以前我們總是要在A中自己編寫程式碼來獲得一個Connection物件,有了spring(中介)我們就只需要告訴spring,A中需要一個Connection,至於這個Connection怎麼構造,何時構造,A不需要知道。在系統執行時,spring會在適當的時候製造一個Connection,然後像打針一樣,注射到A當中,這樣就完成了對各個物件之間關係的控制。A需要依賴 Connection才能正常執行,而這個Connection是由spring注入到A中的,依賴注入的名字就這麼來的。

理解DI的關鍵是:"誰依賴誰,為什麼需要依賴,誰注入誰,注入了什麼?"。
誰依賴於誰
:應用程式依賴於IoC容器(boss依賴中介);
為什麼需要依賴:應用程式需要IoC容器來提供物件需要的外部資源(boss需要中介提供職員,這個職員擁有某種技能,那麼職員的技能對於boss來說就是一種外部資源);
誰注入誰:很明顯是IoC容器注入應用程式某個物件,應用程式依賴的物件(中介把職員注入到boss公司)
注入了什麼:就是注入某個物件所需要的外部資源,包括物件、資源、常量資料(把職員注入到公司,自然而然就獲取的職員的技能).