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而服务

posted on 2022-05-10 14:17  素心~  阅读(90)  评论(0编辑  收藏  举报

导航