1. 程式人生 > >控制反轉(IOC)和依賴注入(DI)的區別

控制反轉(IOC)和依賴注入(DI)的區別

IOC   inversion of control  控制反轉

DI   Dependency Injection  依賴注入

要理解這兩個概念,首先要搞清楚以下幾個問題:

  • 參與者都有誰?
  • 依賴:誰依賴於誰?為什麼需要依賴? 
  • 注入:誰注入於誰?到底注入什麼?
  • 控制反轉:誰控制誰?控制什麼?為何叫反轉(有反轉就應該有正轉了)?
  • 依賴注入和控制反轉是同一概念嗎?

        下面就來簡要的回答一下上述問題,把這些問題搞明白了,IoC/DI也就明白了。
(1)參與者都有誰:

        一般有三方參與者,一個是某個物件;一個是IoC/DI的容器;另一個是某個物件的外部資源。
        又要名詞解釋一下,某個物件指的就是任意的、普通的Java物件; IoC/DI的容器簡單點說就是指用來實現IoC/DI功能的一個框架程式;物件的外部資源指的就是物件需要的,但是是從物件外部獲取的,都統稱資源,比如:物件需要的其它物件、或者是物件需要的檔案資源等等。

(2)誰依賴於誰:

        當然是某個物件依賴於IoC/DI的容器

(3)為什麼需要依賴:

        物件需要IoC/DI的容器來提供物件需要的外部資源

(4)誰注入於誰:

        很明顯是IoC/DI的容器 注入 某個物件

(5)到底注入什麼:

        就是注入某個物件所需要的外部資源

(6)誰控制誰:

        當然是IoC/DI的容器來控制物件了

(7)控制什麼:

        主要是控制物件例項的建立

(8)為何叫反轉:

        反轉是相對於正向而言的,那麼什麼算是正向的呢?考慮一下常規情況下的應用程式,如果要在A裡面使用C,你會怎麼做呢?當然是直接去建立C的物件,也就是說,是在A類中主動去獲取所需要的外部資源C,這種情況被稱為正向的。那麼什麼是反向呢?就是A類不再主動去獲取C,而是被動等待,等待IoC/DI的容器獲取一個C的例項,然後反向的注入到A類中。

用圖例來說明一下,先看沒有IoC/DI的時候,常規的A類使用C類的示意圖,如圖7所示:


                                      圖7  常規A使用C示意圖

當有了IoC/DI的容器後,A類不再主動去建立C了,如圖8所示:


                                     圖8  A類不再主動建立C


而是被動等待,等待IoC/DI的容器獲取一個C的例項,然後反向的注入到A類中,如圖9所示:

                                               圖9  有IoC/DI容器後程序結構示意圖

(9)依賴注入和控制反轉是同一概念嗎?

        根據上面的講述,應該能看出來,依賴注入和控制反轉是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。依賴注入是從應用程式的角度在描述,可以把依賴注入描述完整點:應用程式依賴容器建立並注入它所需要的外部資源而控制反轉是從容器的角度在描述,描述完整點:容器控制應用程式,由容器反向的嚮應用程式注入應用程式所需要的外部資源。


(10)小結一下:

        其實IoC/DI對程式設計帶來的最大改變不是從程式碼上,而是從思想上,發生了“主從換位”的變化。應用程式原本是老大,要獲取什麼資源都是主動出擊,但是在IoC/DI思想中,應用程式就變成被動的了,被動的等待IoC/DI容器來建立並注入它所需要的資源了。
        這麼小小的一個改變其實是程式設計思想的一個大進步,這樣就有效的分離了物件和它所需要的外部資源,使得它們鬆散耦合,有利於功能複用,更重要的是使得程式的整個體系結構變得非常靈活


(11)接下演示一下依賴注入機制的過程

程式碼 待注入的業務物件Content.java
package com.zj.ioc.di.ctor; import com.zj.ioc.di.Content; publicclass MyBusiness { private Content myContent; public MyBusiness(Content content) { myContent = content; } publicvoid doBusiness(){ myContent.BusniessContent(); } publicvoid doAnotherBusiness(){ myContent.AnotherBusniessContent(); } }
MyBusniess類展示了一個業務元件,它的實現需要物件Content的注入。程式碼3,程式碼4,程式碼56分別演示構造子注入(Constructor Injection),設值注入(Setter Injection)和介面注入(Interface Injection)三種方式。
程式碼3 構造子注入(Constructor Injection)MyBusiness.java
package com.zj.ioc.di.ctor; import com.zj.ioc.di.Content; publicclass MyBusiness { private Content myContent; public MyBusiness(Content content) { myContent = content; } publicvoid doBusiness(){ myContent.BusniessContent(); } publicvoid doAnotherBusiness(){ myContent.AnotherBusniessContent(); } }
程式碼4 設值注入(Setter Injection) MyBusiness.java
package com.zj.ioc.di.iface; import com.zj.ioc.di.Content; publicinterface InContent { void createContent(Content content); }
程式碼    設定注入介面InContent.java
package com.zj.ioc.di.iface; import com.zj.ioc.di.Content; publicinterface InContent { void createContent(Content content); }

    程式碼6

    介面注入(Interface InjectionMyBusiness.java

package com.zj.ioc.di.iface; import com.zj.ioc.di.Content; publicclass MyBusiness implements InContent{ private Content myContent; publicvoid createContent(Content content) { myContent = content; } publicvoid doBusniess(){ myContent.BusniessContent(); } publicvoid doAnotherBusniess(){ myContent.AnotherBusniessContent(); } }

相關推薦

複習之spring基礎——控制反轉ioc依賴注入di

Spring的核心——控制反轉 ioc: 反轉控制. 建立物件的方式反轉了.從我們自己建立物件,反轉給spring(程式)來建立. 實現ioc思想需要,di做支援 di: 依賴注入.將必須的屬性注入到物件當中.是實現ioc思想必須條件. 三種物件建立方式 無參

Spring學習1控制反轉IoC依賴注入DI的詳解以及註解annotation開發入門案例

前言 以往的java學習中,我們要想得到一個物件,就把它new出來。如:Apple apple = new Apple(); 在一些複雜的系統中,一個物件A可能依賴於物件B,C等(程式碼表現為A類持有B,C類的物件作為A類的屬性)。以往來說,我們想要使用B,

Spring3(一) 控制反轉IoC依賴注入DI

幾個常用框架之間的關係   1       spring框架概述 1.1   什麼是spring Spring是一個開源、輕量級的Java 開發框架。框架的主要優勢之一就是其分層架構,分層架構允許使用者選擇使

控制反轉IOC依賴注入DI區別

IOC   inversion of control  控制反轉 DI   Dependency Injection  依賴注入 要理解這兩個概念,首先要搞清楚以下幾個問題: 參與者都有誰?依賴:誰依賴於誰?為什麼需要依賴? 注入:誰注入於誰?到底注入什麼?控制反轉:誰控制誰?控制什麼?為何叫反轉(有

laravel服務容器-----深入理解控制反轉IoC依賴注入DI

首先大家想一想什麼是容器,字面意思就是盛放東西的東西,常見的變數,物件屬性都是容器,一個容器能夠裝什麼東西,完全在於你對這個容器的定義。有的容器不僅僅只是存文字,變數,而是物件,屬性,那麼我們通過這種容器就可以進行很多高階的功能。 IoC容器 IoC容器是larave

Laravel 學習筆記:深入理解控制反轉IoC依賴注入DI

目的:解耦和減少依賴關係; 控制反轉(IoC):由外部負責其依賴行為; 例如“超人”類不需要在其內部固化它的“超能力”,而是由外部來產生、組裝“超能力”,再通過“超人”的某個介面中植入; 只要“超能力”滿足某個介面,就能被超人所使用; 依賴注入(DI

8-spring原始碼3.2.18解讀+spring技術內幕IOC容器的依賴注入反射+遞迴呼叫

1、導讀 以上對IOC容器的初始化過程做了詳細的分析,這個初始化過程完成的主要工作是在IOC容器中建立BeanDefinition資料對映。再次過程中並沒有對Bean依賴關係進行注入,接下來將分析一下IOC容器是怎麼樣對Bean的依賴關係進行注入的。 假設當前IOC容器已

Java:控制反轉IoC依賴注入DI

很長一段時間裡,我對控制反轉和依賴注入這兩個概念很模糊,閉上眼睛想一想,總有一種眩暈的感覺。但為了成為一名優秀的 Java 工程師,我花了一週的時間,徹底把它們搞清楚了。 01、緊耦合 在我們編碼的過程中,通常都需要兩個或者更多的類通過彼此的合作來實現業務邏輯,也就是說,某個物件需要獲取與其合作物件的引用

依賴倒置原則DIP控制反轉IoC依賴注入DIC#

理解: 依賴倒置原則(DIP)主程式要依賴於抽象介面,不要依賴於具體實現。高層模組不應該依賴底層模組,兩個都應該以來抽象。抽象不應該依賴細節,細節應該依賴抽象。(具體看我上一篇貼子) 依賴倒置原則是六大設計原則中的一種,它的大致意思是所有模組都應該依賴於抽象,而不是直接依賴於另一個模組。依賴倒置原則僅僅只是一

4. IOC容器的依賴注入原始碼解讀

一、基本概念 1.當Spring IoC容器完成了Bean定義資源的定位、載入和解析註冊以後,IoC容器中已經管理類Bean定義的相關資料,但是此時IoC容器還沒有對所管理的Bean進行依賴注入,依賴注入在以下兩種情況發生: (1)使用者第一次通過getBean

Spring原始碼分析IoC容器的依賴注入2

protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) { //這裡取得在BeanDefinition中設定的property值,這些property來自對BeanDefini

Spring原始碼分析IoC容器的依賴注入1

    依賴注入的過程是使用者第一次向IoC容器索要Bean時才觸發的,當然也有例外,可以在BeanDefinition資訊中通過控制lazy-init屬性來讓容器完成對Bean的預例項化。這個預例項化實際上也是一個完成依賴注入的過程,但它是在初始化的過程中完成的。

maven可選依賴Optional Dependencies依賴排除Dependency Exclusions

許可 mave manage spa 兩個 傳遞 方式 mis ont 我們知道,maven的依賴關系是有傳遞性的。如:A-->B,B-->C。但有時候,項目A可能不是必需依賴C,因此需要在項目A中排除對A的依賴。在maven的依賴管理中,有兩種方式可以對依賴關

ASP.NET Core中的依賴注入2依賴注入DI

IoC主要體現了這樣一種設計思想:通過將一組通用流程的控制從應用轉移到框架之中以實現對流程的複用,同時採用“好萊塢原則”是應用程式以被動的方式實現對流程的定製。我們可以採用若干設計模式以不同的方式實現IoC,比如我們在上面介紹的模板方法、工廠方法和抽象工廠,接下來我們介紹一種更為有價值的IoC模式,即依賴注入

Spring升級案例之IOC介紹依賴注入

#### Spring升級案例之IOC介紹和依賴注入 ##### 一、IOC的概念和作用 ###### 1.什麼是IOC 控制反轉(Inversion of Control, [IoC](https://www.cnblogs.com/xdp-gacl/p/4249939.html))是一種設計思想,在

關於php中依賴注入DI控制反轉IOC的理解

一、什麼是依賴注入和控制反轉 1.依賴注入(DI)— Dependecy Injection 為了更方便的理解,我們把依賴注入分開理解,首先什麼是依賴?顧名思義,依賴就是各元件之間的一種關係。一般來說,在面向物件程式設計中,我們在類A中 使用到了 類B的例項,我們就可以說

Spring 使用註解的方式實現IOCDI控制反轉依賴注入

Spring 使用註解的方式實現IOC和DI 註解的方式實現IOC&DI     1、IOC操作       1)@Component  :用於實現ioc控制反轉,屬性value用於實現物件

IOC控制反轉依賴注入之Autofac

Autofac是一款IOC框架,比較於其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很輕量級效能上也是很高的。於是,今天抽空研究了下它。下載地址:http://code.google

laravel服務容器-----深入理解控制反轉IoC依賴註入DI

outer 十分 綁定 之間 module 還需 true 更多 我們 首先大家想一想什麽是容器,字面意思就是盛放東西的東西,常見的變量,對象屬性都是容器,一個容器能夠裝什麽東西,完全在於你對這個容器的定義。有的容器不僅僅只是存文本,變量,而是對象,屬性,那麽我們通過這種容

PHP控制反轉IOC依賴註入DI

-m ret 客戶端 無需 frame 控制 bsp 而是 div 先上一個例子: <?php class A { public $b; public $c; public function __construct() {