https://baike.baidu.com/item/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC/1158025?fr=aladdin編程
控制反轉(Inversion of Control,縮寫爲IoC),是面向對象編程中的一種設計原則,能夠用來減低計算機代碼之間的耦合度。其中最多見的方式叫作依賴注入(Dependency Injection,簡稱DI),還有一種方式叫「依賴查找」(Dependency Lookup)。經過控制反轉,對象在被建立的時候,由一個調控系統內全部對象的外界實體,將其所依賴的對象的引用傳遞給它。也能夠說,依賴被注入到對象中。框架
重點:函數
一、在過去,反射編程方式相對於正常的對象生成方式要慢10幾倍,這也許也是當時爲何反射技術沒有廣泛應用開來的緣由。但經SUN改良優化後,反射方式生成對象和一般對象生成方式,速度已經相差不大了(但依然有一倍以上的差距)。
優化
二、spa
現有的框架實際上使用如下三種基本技術的框架執行服務和部件間的綁定:
-
類型1 (基於接口): 可服務的對象須要實現一個專門的接口,該接口提供了一個對象,能夠重用這個對象查找依賴(其它服務)。早期的容器Excalibur使用這種模式。
-
類型2 (基於setter): 經過JavaBean的屬性(setter方法)爲可服務對象指定服務。HiveMind和Spring採用這種方式。
-
類型3 (基於構造函數): 經過構造函數的參數爲可服務對象指定服務。PicoContainer只使用這種方式。HiveMind和Spring也使用這種方式。
三、設計
IoC是一個很大的概念,能夠用不一樣的方式實現。其主要形式有兩種:
-
依賴查找:容器提供回調接口和上下文條件給組件。EJB和Apache Avalon 都使用這種方式。這樣一來,組件就必須使用容器提供的API來查找資源和協做對象,僅有的控制反轉只體如今那些回調方法上(也就是上面所說的 類型1):容器將調用這些回調方法,從而讓應用代碼得到相關資源。
-
依賴注入:組件不作定位查詢,只提供普通的Java方法讓容器去決定依賴關係。容器全權負責的組件的裝配,它會把符合依賴關係的對象經過JavaBean屬性或者構造函數傳遞給須要的對象。經過JavaBean屬性注射依賴關係的作法稱爲設值方法注入(Setter Injection);將依賴關係做爲構造函數參數傳入的作法稱爲構造器注入(Constructor Injection)