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