=============================================
博客原文地址:http://ihongqiqu.com/blog/2014/10/19/inversion-of-control/
=========================================================
IoC(Inversion Of Control),直觀地講,就是容器控制程序之間的關系,而非傳統實現中,由程序代碼直接操控。這也就是所謂“控制反轉”的概念所在。控制權由應用代碼中轉到了外部容器,控制權的轉移是所謂反轉。IoC還有另外一個名字——“依賴注入(Dependency Injection)”。從名字上理解,所謂依賴注入,即組件之間的依賴關系由容器在運行期決定,形象地說,即由容器動態地將某種依賴關系注入到組件之中。
在我們的程序中,要實現某個功能,我們都會用到兩個或兩個以上的類來協同完成,那么在一個類中,我們就會要有它的合作類的引用,也就是說這個類依賴於別的類,這個合作類的獲取,也就是依賴獲取的方式主要有三種。
下面通過一個生動形象的例子介紹控制反轉。比如,一個女孩希望找到合適的男朋友,如下圖所示,可以有3種方式,即青梅竹馬、親友介紹、父母包辦。

第一種 青梅竹馬,也就是自己生成
此方式比較簡單,代碼和圖示如下:
1
2 3 4 5 |
|

第一種方法存在如下問題:
- 1.Girl類依賴於Boy類,如果Boy類未完成,則編譯都不能通過。
- 2.不能更改,想換Boy的時候,無法進行修改。
- 3.很難共享,只能自己用。
- 4.Girl要對Boy的生命周期負責,兩個類耦合在了一起。
第二種 親友介紹,也就是通過中介得到
此方法實現代碼和圖示如下:
1
2 3 4 5 |
|

第二種方法通過使用工程類,間接得到需要的對象。存在如下問題:
- 1.每個子類的生成的代碼都寫死在工廠類里面了,如果要換個子類,則必須更改工廠類中的方法
- 2.面向接口編程,一般都會使用工廠類,一般每個接口都會對於一個工程類,當項目非常大的時候,則會有非常多的工廠類
第三種 父母包辦,也就是直接被注入
此種方法實現代碼和圖示如下:
1
2 3 4 5 6 7 |
|

第三種方法只需要在外部傳入一個現成的對象給方法調用,不同的實現傳入不同的對象即可。
哪一種為控制反轉IoC呢?雖然在現實生活中我們都希望青梅竹馬,但在現實世界里,選擇的卻是父母包辦,它就是控制反轉,而這里具有控制力的父母,就是所謂的容器概念。
典型的IOC可以如下圖所示。

IOC可以通過以下3種方式實現:
第一種 接口注入
這種方式要求我們自己定義的組建類必須實現容器給定的一個接口,然后容器通過這個接口,為我們的組建類注入所依賴的類 缺點:容器對組建的侵入性會很強,實現的組建只能給此容器用了,移植性不強
第二種 Setter注入
在容器中,通過調用對象的setter()方法,將該對象的依賴傳遞到類當中
第三種 構造器注入
通過使用構造器,在類初始化的時候,傳入對象的依賴
如果是這樣的話,那么我們僅僅只是完成了一些基於依賴倒轉的代碼重構工作而已,並沒有真正的體現系統的動態性。最大程度的將兩個類之間的依賴降低,實現解耦合,我們可以開發基於配置的程序。
IoC核心理念:
- 1.在類當中不創建對象,在代碼中不直接與對象和服務連接
- 2.在配置文件中描述創建對象的方式,以及各個組件之間的聯系
- 3.外部容器通過解析配置文件,通過反射來將這些聯系在一起
The Hollywood principle:Don’t call us,we’ll call you. 即,所有組件都是被動的、不主動聯系(調用)外部代碼, 要等着外部代碼的調用————所有的組件的初始化和相互調用都由容器負責實現。 簡單的說,就是整個程序之間的關系,都由容器來控制:將程序的控制權反轉給容器,就是所謂的反轉。
參考文獻地址:
=================================================
博客原文地址:http://ihongqiqu.com/blog/2014/10/19/inversion-of-control/
=================================================
