IOC和DI到底是什么?


 

 

   在學習Spring框架的時候,我們總是能見到IOC這個單詞,也時常聽到DI這個詞,那么他們分別是什么意思呢?接下來就講講個人對於這兩個概念的理解

   一、IOC和DI概念

  IOC(控制反轉):全稱為:Inverse of Control。從字面上理解就是控制反轉了,將對在自身對象中的一個內置對象的控制反轉,反轉后不再由自己本身的對象進行控制這個內置對象的創建,而是由第三方系統去控制這個內置對象的創建。

  DI(依賴注入):全稱為Dependency Injection,意思自身對象中的內置對象是通過注入的方式進行創建。

     那么IOCDI這兩者又是什么關系呢?

  IOC就是一種軟件設計思想,DI是這種軟件設計思想的一個實現。而Spring中的核心機制就是DI。

   二、實例理解IOC

復制代碼
class Person{
    
    private Wear clothe;

    public Wear getClothe() {
        return clothe;
    }

    public void setClothe(Wear clothe) {
        this.clothe = clothe;
    }
    
    public void Wear(){
        clothe  = new Sweater();
        clothe.WearClothe();
    }   
}

interface Wear{
    void WearClothe();
}

class Sweater implements Wear{

    @Override
    public void WearClothe() {
        // TODO Auto-generated method stub
        System.out.println("穿毛衣");
    }    
}

class Shirt implements Wear{
    @Override
    public void WearClothe() {
        // TODO Auto-generated method stub
        System.out.println("穿襯衫");
    }    
}
public static void main(String[] args){
        Person person = new Person();
        person.Wear();
    }
復制代碼

  在上面的代碼中我們定義一個Wear接口,兩個實現了該接口的類Sweater和Shirt,在Person類的Wear需要調用Wear接口的WearClothe方法,傳統的做法是在Person的Wear中創建該接口的實現類,然后通過該對象對調用這個方法。在Person對象的內部創建了這個對象,既是控制了這個對象,當我們需要調用Shirt的WearClothe方法的時候就需要改動Person類中Wear方法的代碼,去創建一個Shirt類對象。

  而在IOC的設計思想中,我們將不再Person的內部進行創建Clothe屬性的引用對象,而是在外界創建該對象,然后注入到Person對象中。代碼實現如下:

  修改Person類的Wear方法:

  public void Wear(){
        clothe.WearClothe();
    }

  在main方法中調用:

復制代碼
  public static void main(String[] args){
        Wear wear= new Sweater();
        Person person = new Person();
        person.setClothe(sweater);
        person.Wear();
    }
復制代碼

   通過在外界創建一個Wear接口的實現類對象,然后將該對象傳入person對象中,將person對象對於sweater對象的控制反轉,person對象不再進行Wear接口實現對象的創建。如果我們需要調用Shirt的wear方法,只需要更改創建Shirt對象,不再需要修改Person類內部的方法,就可以實現了。

    這就是我理解的IOC,簡單來說就是把本來在類內部控制的對象,反轉到類外部進行創建后注入,不再由類本身進行控制,這就是IOC的本質。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM