1. 程式人生 > 其它 >IOC控制反轉,DI依賴注入,DIP依賴倒置,原理解析

IOC控制反轉,DI依賴注入,DIP依賴倒置,原理解析

什麼是IOC,DI,IOC,DI解決了什麼問題,IOC,DI的原理是什麼?

  • 什麼是IOC,IOC的意義是控制反轉,DI是依賴注入,兩者息息相關,換個角度說IOC是一個概念而DI是其實現

例1:

public class B {
   public void printB() {
       System.out.print("this is B");
   }
}

public class A {
   public void main() {
       B b = new B();
       b.printB();
   }
}

  • 上述兩個類 A類依賴B類才能實現相關業務邏輯,那麼A類又可以叫主控類,或主控方
  • 在這個過程當中,A類自己進行了物件的例項化
  • 那麼控制反轉的意思就是我們將物件例項化的過程交給容器,主控方A類不在負責B的例項化
  • 容器負責物件的例項化過程並且裝配給A類這不就控制反轉了
  • 什麼是依賴注入原本是我們自己去完成物件例項化,現在是容器直接注入給我們不就是依賴注入
  • 舉例說明
public class Container {
    public void mian() {
        A obj = new A(new B());
        obj.setB(new B());
    }
}

public class B {
    public void printB() {
        System.out.print("this is B");
    }
}

public class A {
    public B b;

    A(B b) {
        this.b = b;
    }

    public void setB(B b) {
        this.b = b;
    }

    public void main() {
        this.b.printB();
    }
} 

  • IOC和DI解決了什麼問題,軟體開發必須要遵循OCP原則,但是在軟體開發過程中類與類之間的依賴關係往往非常複雜,那麼這就很難符合OCP
  • 而造成這個問題的主要原因是,具體類自己負責了物件的例項化過程
  • 如果我們用面向抽象的方式開發並且將類例項化的過程交給容器,那我們的程式碼是不是就足夠穩定?
public interface IB {
    void printB();
}

public class B implements IB {
    public void printB() {
        System.out.print("this is B");
    }
}

public class A {
    public IB ib;

    A(IB b) {
        this.ib = b;
    }

    public void setB(IB b) {
        this.ib = b;
    }

    public void main() {
        this.ib.printB();
    }
} 

  • 上述程式碼我們將物件例項化控制權交給容器,就是IOC,容器給我們注入了物件就是依賴容器,同時它也符合了OCP原則 無論B類如何變化,都不會影響A類,所以A類足夠穩定
  • 得出結論IOC與DI的原理是為OCP服務

什麼是DIP

  • 高層模組不能依賴底層模組,它們都應該依賴抽象
  • 細節應該依賴抽象
  • 抽象不能依賴細節
  • DIP的概念就是說具體類應該依賴抽象,抽象不能依賴具體類,概念是為開發服務的,DIP,IOC,DI,的概念都是為了更好的實現OCP而服務