关于java:面试突击73IoC-和-DI-有什么区别

1次阅读

共计 1946 个字符,预计需要花费 5 分钟才能阅读完成。

IoC 和 DI 都是 Spring 框架中的重要概念,就像玫瑰花与恋情一样,IoC 和 DI 通常状况下也是成对呈现的。那 IoC 和 DI 什么关系和区别呢?接下来,咱们一起来看。

1.IoC 介绍

IoC 是 Inversion of Control 的缩写,翻译成中文是“管制反转”的意思,它不是一个具体的技术,而是一个实现对象解耦的思维。

要解释什么是解耦?就要理解什么是耦合,所谓的 耦合是指:两个或两个以上对象存在依赖,当一方批改之后会影响另一方,那么就说这些对象间存在耦合。而解耦就是解除两个或两个以上对象,批改之后影响另一方的问题。

那 IoC(管制反转)是如何实现解耦的呢?

咱们来举一个例子,比方 A 对象中须要应用 B 对象的某个办法,那么咱们通常的实现办法是这样的:

class A {public void init() {
        // 调用 B 类中的 init 办法
        B b = new B();
        b.init();}
}
class B {public B() { }

    public void init() {System.out.println("你好,世界。");
    }
}

然而此时对象 A 和对象 B 是存在耦合的,因为一旦批改了 B 对象构造方法的参数之后,那么 A 对象外面的写法也要跟着扭转,比方当咱们将构造方法改为以下代码时:

class B {public B(String name) {System.out.println("姓名:" + name);
    }
    public void init() {System.out.println("你好,世界。");
    }
}

此时构造方法曾经从本来无参构造方法变成了有参的构造方法,这里不思考构造方法重载的状况,因为理论业务中,很可能是 B 类的构造方法写错了,遗记加参数了,于是前面又补充了一个参数,此时是不须要对构造方法进行重载的,那么此时,之前对象 A 外面的调用就会报错,如下图所示:

这就是开发中常常遇到的一个问题,那怎么解决呢?

咱们能够通过将对象传递而并 new 对象的形式来解决,如下代码所示:

class A {
    // 先定义一个须要依赖的 B 对象
    private B b;
    // 通过构造方法实现赋值(初始化)public A(B b) {this.b = b;}
    public void init() {
        // 调用 B 类中的 init 办法
        b.init();}
}
class B {public B(String name) {System.out.println("姓名:" + name);
    }
    public void init() {System.out.println("你好,世界。");
    }
}

这样革新之后,无论构造方法怎么批改,即便须要加更多的参数,而调用它的 A 类都无需做任何批改,这样就实现了对象的解耦。

那这个解耦的示例和 IoC 有什么关系呢?

IoC 实现的思路和上述示例一样,就是通过将对象交给 Spring 中 IoC 容器治理,在其余类中不间接 new 对象,而是通过将对象传递到以后类的形式来实现解耦的。

小结

在 new 对象的时代,对象的管理权是由以后类管制的,而有了 IoC 之后,对象的管理权就交给非以后类的 IoC 容器治理了,此时对象的管理权就产生了反转和扭转,这就是 IoC,这就是管制(权)反转。

2.DI 介绍

DI 是 Dependency Injection 的缩写,翻译成中文是“依赖注入”的意思。依赖注入不是一种设计实现,而是一种具体的技术 ,它是 在 IoC 容器运行期间,动静地将某个依赖对象注入到以后对象的技术就叫做 DI(依赖注入)

在上述示例中,A 类在应用 B 类时,就是通过构造方法将依赖对象 B 引入的,这种实现办法就能够看作是通过构造方法实现依赖注入的伎俩,具体代码如下:

class A {
    // 先定义一个须要依赖的 B 对象
    private B b;
    // 通过构造方法实现赋值
    public A(B b) {this.b = b;}
    public void init() {
        // 调用 B 类中的 init 办法
        b.init();}
}

3.IoC VS DI

从下面的内容中咱们能够看出,IoC 和 DI 尽管定义不同,但它们所做的事件都是一样的,都是用来实现对象解耦的,而二者又有所不同:IoC 是一种设计思维,而 DI 是一种具体的实现技术

比方,磊哥明天情绪比拟好,想进来吃顿好的,那么“想吃顿好的”就是一种思维、就是 IoC。

但什么才是“好的(饭)”呢?海底捞还是韩式操持?具体吃什么是 DI。

因而“磊哥明天情绪比拟好,想进来吃顿好的”是一种思维、是 IoC,而吃一顿海底捞而非韩式操持就是具体的实现、是 DI。

总结

IoC 和 DI 都是 Spring 框架中的重要概念,它们都是用来实现对象解耦的,其中 IoC(管制反转)是一种设计思维,而 DI(依赖注入)是一种具体的实现伎俩。

是非审之于己,毁誉听之于人,得失安之于数。

公众号:Java 面试真题解析

面试合集:https://gitee.com/mydb/interview

正文完
 0