我的理解控制反轉(IoC)與依賴注入(DI)

一,爲何會出現依賴注入這個概念?spring

 控制反轉(IoC=Inversion of Control),是一種思想,指的是控制權的轉移,即(依賴)控制權由應用代碼中轉到了第三方外部容器(如Spring容器)設計模式

二,Spring-IoC容器app

  對於 Spring 框架來講,所謂 IoC就是由 Spring 來負責控制對象的生命週期和對象間的關係, 用 XML 來定義生成對象的模式。框架

  在一個對象中,若是要使用另外的對象,就必須獲得它(本身 new 一個,或者從 JNDI 中查詢一個),使用完以後還要將對象銷燬(好比 Connection 等)。那麼 Spring-IoC 是如何作的呢?this

  全部的類都會在 Spring 容器中登記,告訴 Spring 你是個什 麼東西,你須要什麼東西,而後 Spring 會在系統運行到適當的時候,把你要的東西主動給你,同時也把你交給其餘須要你的東西。全部的類的建立、銷燬都由 Spring 來控制,也就是說控制對象生存週期的再也不是引用它的對象,而是 Spring 。對於某個具體的對象而言,之前是它控制其餘對象,如今是全部對象都被 Spring 控制。spa

二,Spring-IoC的使用設計

  在下面例子中,咱們使用 Spring 提供的 IoC 容器來管理咱們的用戶註冊類。code

  UserRegister依賴於UserDao的實現類,咱們使用 IoC 容器在運行期動態的爲UserRegister注入UserDao的實現類。即UserRegisterUserDao的依賴關係由容器注入,UserRegister不用關心UserDao的任何具體實現類。若是要更改用戶的持久化方式,只要修改配置文件 applicationContext.xml 便可。依賴注入機制減輕了組件之間的依賴關係,同時也大大提升了組件的可移植性,這意味着,組件獲得重用的機會將會更多。xml

用戶註冊類UserRegister的部分代碼以下:對象

public class UserRegister {

    private UserDao userDao = null;//由容器注入的實例對象

    public void setUserDao(UserDao userDao){

        this.userDao = userDao;

    }

       // UserRegister的業務方法

}

在其它的UserRegister方法中就能夠直接使用userDao對象了,它的實例由Spring容器主動爲它建立。可是,如何組裝一個UserDao的實現類到UserRegister中呢?哦,Spring 提供了配置文件來組裝咱們的組件。Spring 的配置文件 applicationContext.xml 代碼片段以下:

<bean id="userRegister" class="com.dev.spring.simple.UserRegister">

       <property name="userDao"><ref local="userDao"/></property>

</bean>

<bean id="userDao" class="com.dev.spring.simple.MemoryUserDao"/>

四,依賴注入

  組件的依賴關係由容器實現,那麼容器如何知道一個組件依賴哪些其它的組件呢?如上面例子中,容器如何得知UserRegister依賴於UserDao呢?

  Spring的組件提供了一系列所謂的回調方法(也叫注入方法),這些注入方法會告知容器它所依賴的組件,也就是將實例變量傳到另外一個對象中去。依賴注入爲實現IOC思想作技術支持。

  根據注入方法的不一樣,咱們能夠將 IoC 分爲三種形式:接口注入,值注入,構造方法注入。根據注入類型的不一樣,分爲:值類型注入(8大基本數據類型),引用類型注入(Dao注入Service,service注入action,也就是依賴對象注入)。

五,依賴注入與控制反轉

  • 控制反轉是一種思想
  • 依賴注入是一種設計模式

  IoC框架使用依賴注入做爲實現控制反轉的方式,可是控制反轉還有其餘的實現方式,因此不能將控制反轉和依賴注入等同。

六,總結

  1. 控制反轉是一種在軟件工程中解耦合的思想,調用類只依賴接口,而不依賴具體的實現類,減小了耦合。控制權交給了容器,在運行的時候才由容器決定將具體的實現動態的「注入」到調用類的對象中。
  2. 依賴注入是一種設計模式,能夠做爲控制反轉的一種實現方式。依賴注入就是將實例變量傳入到一個對象中去(Dependency injection means giving an object its instance variables)。
  3. 經過IoC框架,類A依賴類B的強耦合關係能夠在運行時經過容器創建,也就是說把建立B實例的工做移交給容器,類A只管使用就能夠。
相關文章
相關標籤/搜索