面试官:IoC 和 DI 有什么区别?
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 有什么区别?相关推荐
- 面试官:说说 typeof 与 instanceof 区别?
一.typeof typeof 操作符返回一个字符串,表示未经计算的操作数的类型 使用方法如下: typeof operand typeof(operand) operand表示对象或原始值的表达式, ...
- 【IoC 和 DI 有什么区别】
IoC 和 DI 都是 Spring 框架的核心概念,它们都涉及到对象之间的依赖关系.它们的主要区别在于: IoC(Inversion of Control,控制反转): IoC 是一种设计模式,它的 ...
- 【运维面试】面试官:reids和memcache的区别?
前言 redis和memcache的区别在面试中也经常会被提到,今天我们来看看redis与memcache的知识 概念 memcached: 一款开源的,高性能,分布式的内存系统 redis:一个开源 ...
- IOC和DI有什么区别
没有区别,IOC=DI 因为,IOC是控制反转,2004年大神Martin Fowler说,控制反转?控制的什么被反转了?想了半天明白了,原来就是获得依赖对象的方式反转了.于是IOC的另一种说法就出来 ...
- 面试官:谈谈equals() 和 == 的区别
引言 谈谈equals() 和 == 的区别,这是一个非常经典的问题,不是特别难,面试也时有问道:但是很多小伙伴在面试时脑子却一片空白,痛失offer:所以在这里我详细介绍一下这两者的区别,希望对你能 ...
- 面试官:Java深拷贝和浅拷贝区别
文章目录 一.拷贝的引入 (1).引用拷贝 (2).对象拷贝 二.浅拷贝 (1).定义 (2).浅拷贝实例 三.深拷贝 (1).定义 (2).深拷贝实例 一.拷贝的引入 (1).引用拷贝 创建一个指向 ...
- 百度面试官:来聊聊Spring吧
文章目录 Spring入门和IOC介绍 1. Spring介绍 1.1侵入式概念 1.2 松耦合概念 1.3 切面编程 2. 引出Spring 2.1 IOC控制反转 3.Spring模块 4. Co ...
- Spring IoC和DI XML方式 注解方式 依赖注入 AOP面向切面
初识Spring框架 时代变迁 原始时代我们用一个jsp搞定一切,但如此开发大型项目时我们遇到了问题,前端美化的代码和后端的代码交织,代码中又有html.js.css样式,又有业务逻辑和数据库访问代码 ...
- 面试官问我 StringBuilder 线程不安全的点在哪儿.....
点击关注公众号,Java干货及时送达 来源:cnblogs.com/keatsCoder/p/13212289.html 引言 面试官: StringBuilder和StringBuffer的区别在哪 ...
最新文章
- Eclipse保存文件时出现字符编码错误
- edit filter rules in sql source control
- java类加载器 架构 设计_类加载器(DexClassLoader)与插件化(动态加载)
- Workflow WF Reference Links for 2009-03-20
- 腾讯专家深度解析赛题,现场答疑助力上分!
- Bash语言的学习笔记~(legacy)
- 20210612:力扣第244周周赛题解(上)
- 速修复!Netgear交换机曝3个严重的认证绕过漏洞
- jmeter之使用代理录制脚本
- 数论入门基础(同余定理/费马小定理/扩展欧几里德算法/中国剩余定理)
- c语言程序设计-简单的c语言程序
- 【测试基础】Linux文本编辑vi命令
- 不能启动安全中心服务器,无法启动windows安全中心的解决办法
- Java中unicode占几个,Java语言使用的是Unicode字符集,每个字符在内存中占8位。()...
- Android防止启动页面闪白问题
- 2022年最新河南建筑安全员模拟题库及答案
- C# 解析CSV文件
- UE4地形使用卫星贴图
- 基于U3D的VR开发教程:(1)基础环境配置
- 关于Windows聚焦一直保持一个图不变或者不显示