IoC和DI都是Spring框架中的重要概念,就像玫瑰和爱情一样,IoC和DI通常成对出现。那么IoC和DI有什么关系和区别呢?接下来,我们一起来看看吧。1.IoC介绍IoC是InversionofControl的缩写,翻译成中文就是“控制反转”的意思,它不是一种具体的技术,而是一种实现对象解耦的思想。解释什么是解耦?有必要了解什么是耦合。所谓耦合,就是两个或多个对象之间存在依赖关系。当一方被修改而另一方受到影响时,那么这些对象之间就存在耦合。而解耦就是去除两个或多个对象,修改后影响对方。IoC(InversionofControl)是如何实现解耦的?让我们举个例子。比如对象A中需要使用对象B的一个方法,那么我们通常的实现方式如下:);b.初始化();}}classB{publicB(){}publicvoidinit(){System.out.println("Hello,world.");但是,此时的对象A和对象B是有耦合关系的,因为一旦修改了B对象的构造方法的参数,那么A对象中的写法也会随之改变。例如,当我们将构造方法改为如下代码时:classB{publicB(Stringname){System.out.println("Name:"+name);}publicvoidinit(){System.out.println("你好,世界。");}}此时构造方法已经从原来的无参构造方法变成了带参数的构造方法,这里不考虑构造方法重载的情况,因为在实际业务中,很可能B类的构造方法写错了,忘了加一个参数,所以后面又加了一个参数,这个时候就不需要重载构造函数了,这时候在前面对象A中调用会报错error,如下图所示:这是开发A中经常遇到的问题,那么如何解决呢?我们可以通过传递对象而不是new对象来解决,如下代码所示:classA{//先定义一个需要依赖的B对象privateBb;//通过构造函数赋值(初始化)publicA(Bb){this.b=b;}publicvoidinit(){//调用B类中的初始化方法b.init();}}classB{publicB(Stringname){System.out.println("Name:"+name);}publicvoidinit(){System.out.println("Hello,world.");}}这样改造之后,无论怎么修改构造方法,即使需要增加更多的参数,调用它的A类也不需要修改,从而实现了对象的解耦。那么这个解耦例子跟IoC有什么关系呢?IoC的实现思路和上面的例子一样,都是通过将对象交给Spring中的IoC容器来管理,而不是直接在其他类中new对象,而是通过将对象传递给当前类来实现解耦。总结在新对象时代,对象的管理权由当前类控制,而有了IoC,对象的管理权交给了非当前类的IoC容器进行管理。这时候对象的管理权被颠倒了,发生了变化,这就是IoC,这就是控制反转(右)。2.DI介绍DI是DependencyInjection的缩写,翻译成中文就是“依赖注入”的意思。依赖注入不是一种设计实现,而是一种具体的技术。IoC容器在运行过程中,将依赖对象动态注入当前对象的技术称为DI(DependencyInjection)。上面的例子中,A类在使用B类时,通过构造方法引入了依赖对象B。这种实现方式可以看作是通过构造方法实现依赖注入的一种手段。具体代码如下:classA{//首先定义一个依赖B的对象privateBb;//通过构造方法实现赋值publicA(Bb){this.b=b;}publicvoidinit(){//调用B类中的init方法b.init();}}3.IoCVSDI从上面的内容我们可以看出,IoC和DI虽然定义不同,但是做的事情是一样的,都是用来实现对象解耦的。而且两者不同的是:IoC是一种设计思想,而DI是一种具体的实现技术。比如雷哥今天心情比较好,想出去好好吃饭,所以“想好好吃饭”就是一种思想和IoC。但什么是“好(米)”?海底捞还是韩国料理?你具体吃的是DI。所以,“雷哥今天心情好,想出去吃顿好饭”是一种思想和IoC,而吃一顿海底捞而不是韩国料理是具体实现,是DI。总结IoC和DI都是Spring框架中的重要概念。它们都是用来实现对象解耦的。其中IoC(InversionofControl)是一种设计思想,DI(DependencyInjection)是具体的实现方式。.判断是非在自己,名誉在别人,得失在人数。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview
