深入理解spring容器中的控制反轉(IOC)和依賴注入(DI)

My_name_is_ZwZ發表於2018-10-20

什麼是控制反轉(IOC)?

“控制”就是指一件事物對另一件事物進行一種管理,而另一件事物處在一件事物的管理之下,這就叫控制。

在物件導向程式設計的時候,每一個程式的執行都是依賴於很多的物件, 這些物件一起相互協調工作才使得程式得以執行。而在程式設計早期主流框架還沒有出現的時候,這些物件都是我們程式設計師new出來的。這樣子就會出現很多問題,比如耦合度太強,不便於維護;每次執行程式的某個模組的時候可能都會去建立相應的物件(例如:servlet中的一個物件,如果使用new的方式建立的話,那麼每次使用者向這個servlet傳送請求的時候都會去new這個物件。那麼如果是很多使用者訪問的話,這個開銷還是很大的),造成資源的浪費。

有了spring框架之後,這些物件建立的任務就交給了它,你想用的時候就找它要就OK。而這個物件是交給spring集中在一個地方去管理的,這樣子的話耦合性就大大降低,而且便於維護(通俗點講就是便於修改)。需要了就找它要。

“反轉”指轉向相反的方向。分析上邊這兩段話的話:建立物件其實就是一種“控制”,之前時候是程式設計師自己去new,這就叫做”正向“,程式設計師想在哪new就在哪new。而讓spring去管理物件的時候,程式設計師不再有主動權了,變成了被動的伸手去要,相對於之前的“正向”現在完全反過來了。所以叫做“反轉”

拿別人的言語來理解上邊介紹的“控制反轉”這個詞(轉載https://www.cnblogs.com/xxzhuang/p/5948902.html):在控制“正”轉的情況下,在任何一個有請求作用的系統當中,至少需要有兩個類互相配合工作,在一個入口類下使用new關鍵字建立另一個類的物件例項,這就好比在物件導向程式設計的思想下,“我“充當一個入口類,在這個入口類中,我每次吃飯的時候都要買一雙一次性筷子(每一次使用都要new一次),在這樣的關係下,是”我“(即呼叫者)每次都要”主動“去買一次性筷子(另一個類),我對筷子說你老老實實的過來我的手上。是我控制了筷子,在這種控制“正”轉的關係下,放在現實生活當中,肯定是不現實的,更確切的做法是,買一雙普通的筷子(非一次性),把他放在一個容器當中(在Spring中叫做IOC容器),你需要使用的時候就對容器說:IOC我想要用筷子(向容器發出請求),接著筷子就會”注入“到的手上,而在這個過程當中,你不再是控制方,反而演變成一名請求者(雖然本身還是呼叫者),依賴於容器給予你資源,控制權坐落到了容器身上,於是這就是人們俗稱的控制反轉

什麼是依賴注入(DI)?

上邊提到的“控制反轉”是一種思想,側重於原理,通過這種思想可以把物件建立出來;而依賴注入的話可以理解成是給建立出來的物件的屬性賦值的過程,側重於實現。

【注】這樣子去理解IOC/DI的關係:他們是對同一個事情的不同描述。依賴注入是站在應用程式的角度在描述整個過程,而控制反轉是從容器的角度在描述。

相關文章