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知识与技巧,关注与私信博主(555)!
热爱学习和渴望进阶的小伙伴,各种JAVA学习路线、笔记、面试题,免费分享!

面试官:IoC 和 DI 有什么区别?相关推荐

  1. 面试官:说说 typeof 与 instanceof 区别?

    一.typeof typeof 操作符返回一个字符串,表示未经计算的操作数的类型 使用方法如下: typeof operand typeof(operand) operand表示对象或原始值的表达式, ...

  2. 【IoC 和 DI 有什么区别】

    IoC 和 DI 都是 Spring 框架的核心概念,它们都涉及到对象之间的依赖关系.它们的主要区别在于: IoC(Inversion of Control,控制反转): IoC 是一种设计模式,它的 ...

  3. 【运维面试】面试官:reids和memcache的区别?

    前言 redis和memcache的区别在面试中也经常会被提到,今天我们来看看redis与memcache的知识 概念 memcached: 一款开源的,高性能,分布式的内存系统 redis:一个开源 ...

  4. IOC和DI有什么区别

    没有区别,IOC=DI 因为,IOC是控制反转,2004年大神Martin Fowler说,控制反转?控制的什么被反转了?想了半天明白了,原来就是获得依赖对象的方式反转了.于是IOC的另一种说法就出来 ...

  5. 面试官:谈谈equals() 和 == 的区别

    引言 谈谈equals() 和 == 的区别,这是一个非常经典的问题,不是特别难,面试也时有问道:但是很多小伙伴在面试时脑子却一片空白,痛失offer:所以在这里我详细介绍一下这两者的区别,希望对你能 ...

  6. 面试官:Java深拷贝和浅拷贝区别

    文章目录 一.拷贝的引入 (1).引用拷贝 (2).对象拷贝 二.浅拷贝 (1).定义 (2).浅拷贝实例 三.深拷贝 (1).定义 (2).深拷贝实例 一.拷贝的引入 (1).引用拷贝 创建一个指向 ...

  7. 百度面试官:来聊聊Spring吧

    文章目录 Spring入门和IOC介绍 1. Spring介绍 1.1侵入式概念 1.2 松耦合概念 1.3 切面编程 2. 引出Spring 2.1 IOC控制反转 3.Spring模块 4. Co ...

  8. Spring IoC和DI XML方式 注解方式 依赖注入 AOP面向切面

    初识Spring框架 时代变迁 原始时代我们用一个jsp搞定一切,但如此开发大型项目时我们遇到了问题,前端美化的代码和后端的代码交织,代码中又有html.js.css样式,又有业务逻辑和数据库访问代码 ...

  9. 面试官问我 StringBuilder 线程不安全的点在哪儿.....

    点击关注公众号,Java干货及时送达 来源:cnblogs.com/keatsCoder/p/13212289.html 引言 面试官: StringBuilder和StringBuffer的区别在哪 ...

最新文章

  1. Eclipse保存文件时出现字符编码错误
  2. edit filter rules in sql source control
  3. java类加载器 架构 设计_类加载器(DexClassLoader)与插件化(动态加载)
  4. Workflow WF Reference Links for 2009-03-20
  5. 腾讯专家深度解析赛题,现场答疑助力上分!
  6. Bash语言的学习笔记~(legacy)
  7. 20210612:力扣第244周周赛题解(上)
  8. 速修复!Netgear交换机曝3个严重的认证绕过漏洞
  9. jmeter之使用代理录制脚本
  10. 数论入门基础(同余定理/费马小定理/扩展欧几里德算法/中国剩余定理)
  11. c语言程序设计-简单的c语言程序
  12. 【测试基础】Linux文本编辑vi命令
  13. 不能启动安全中心服务器,无法启动windows安全中心的解决办法
  14. Java中unicode占几个,Java语言使用的是Unicode字符集,每个字符在内存中占8位。()...
  15. Android防止启动页面闪白问题
  16. 2022年最新河南建筑安全员模拟题库及答案
  17. C# 解析CSV文件
  18. UE4地形使用卫星贴图
  19. 基于U3D的VR开发教程:(1)基础环境配置
  20. 关于Windows聚焦一直保持一个图不变或者不显示

热门文章

  1. MacOS-Homebrew
  2. 传统C/S软件的断骨增高
  3. OPENCV scalar
  4. 如何升级dart sdk以及choco不是内部或外部命令
  5. QT 支持多客户端网络视频监控的实现
  6. 使用HTML+CSS制作一个简单的网页
  7. JavaWeb-smbms项目
  8. 云原生Java架构师——KubeSphere DevOps流水线部署RuoyiCloud
  9. 头歌 数据结构与算法答案 善用目录
  10. 多变量干扰事件发生下的地铁客流预测