news 2026/7/30 7:53:49

java面试:可以详细讲一讲IOC和依赖注入吗?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java面试:可以详细讲一讲IOC和依赖注入吗?

IOC在Spring当中被称之为控制反转,可以说是java生态当中的一个非常重要的底层思维,而控制反转这一思想能大大帮助程序解耦,而依赖注入也就是DI是实现IOC的一种手段,帮助java完成这样的一套思维逻辑,因此这两点在面试当中不可谓不重要,今天小编就和大家来详细聊一聊这一块内容,希望大家能从中有所收获。

1.IOC的概念

IOC常常被称之为控制反转,而控制指的就是控制对象的创建过程,反转则反转的是对象的创建主体,由程序员转变为容器。而在Spring当中我们的容器实际上就是一个单例工厂,当中的一个个对象实际上就是bean,我们不需要去真正的创建一个对象,而是定义一个对象的创建过程,而创建的权力,我们就交给容器来负责。

2.IOC有什么作用

在Spring的工程启动之后,我们的容器也就是单例工厂就会被初始化,而在容器当中的bean对象就会被实例化。而这样我们就会发现,通过这样一套机制,我们bean对象的实例化由运行时期,提前到了启动时期。

而在这样的一套流程之下,假设类与类出现了依赖或者其他的问题,我们就能提早发现程序当中的问题并且解决问题。

同时,我们将创建对象的权力交给容器,让容器帮助我们去实现创建,但是假设创建对象的这个过程要交给程序员自己来进行管理,我们每次使用一个对象都要去new一个新的对象,这样就会造成大量的对象被创建,在这样的情况之下就会频繁的触发GC的垃圾回收,还可能出现OOM(内存溢出)的问题。

而容器也可以帮助我们实现解耦,而这样我们的单例对象bean就只依赖抽象的接口,而我们只要将实体类注入到容器当中,再让容器帮助我们进行依赖注入即可,这样代码当中相互依赖的单例bean不需要new任何一个实现,高层模块与低层模块没有直接的关联,而是只依赖于底层模块对应的抽象接口,这样就实现了最大程度上的解耦 。

3.依赖注入DI

依赖注入是一种设计模式,是实现IOC的核心手段,它的核心思想是:对象不自己创建它所依赖的对象,而是由外部注入进来。

一般有三种注入方式,分别是

1,构造器注入

  • 依赖通过构造函数一次性传进来,对象实例化后即为最终状态。

  • 天然支持final,线程安全、不可变。

  • 单元测试时new即可,无需容器。

  • 循环依赖会启动即报错。

// ① 服务接口 public interface Engine { String start(); } // ② 服务实现 @Service public class V8Engine implements Engine { public String start() { return "V8 引擎轰鸣"; } } // ③ 调用者 @RestController @RequestMapping("/car") public class CarController { private final Engine engine; // 1. 加 final 强制构造填充 public CarController(Engine engine) { // 2. 只有一个构造器,Spring 自动注入 this.engine = engine; } @GetMapping("/run") public String run() { return engine.start(); } }

2.Setter注入

  • 通过setter方法把依赖“塞”进去,运行期可更换。

  • 对象可变,多线程环境下需自己保证同步。

  • 测试时必须手动调用 setter。

  • 因允许为空,IDE 无法静态提示缺失依赖。

// ① 服务接口 public interface Battery { String level(); } // ② 服务实现 @Service public class LiBattery implements Battery { public String level() { return "锂电池电量 88%"; } } // ③ 调用者 @RestController @RequestMapping("/bike") public class BikeController { private Battery battery; // 1. 非 final,可变的 @Autowired // 2. 写在 setter 上,更直观 public void setBattery(Battery battery) { this.battery = battery; } @GetMapping("/power") public String power() { return battery.level(); } }

3.字段注入

  • 直接在字段上加@Autowired,Spring 通过反射赋值,代码量最少。

  • 无法使用final,也不能在构造函数里做校验。

  • 单元测试必须启动 Spring 容器或使用反射工具。

  • 循环依赖时 Spring 会悄悄生成代理,把设计问题拖到运行时。

// ① 服务接口 public interface Motor { String spin(); } // ② 服务实现 @Service public class BrushlessMotor implements Motor { public String spin() { return "无刷电机静音旋转"; } } // ③ 调用者 @RestController @RequestMapping("/scooter") public class ScooterController { @Autowired // 1. 直接打在字段上,省代码 private Motor motor; // 2. 没有 setter/构造器痕迹 @GetMapping("/go") public String go() { return motor.spin(); } }

在这里我们并不太推荐基于字段注入,更推荐构造器注入,虽然基于字段注入的代码简洁方便,但会出现不能注入final修饰,空指针异常等等问题。

今天的分享就到这里了,希望这篇博客能给你一些帮助,让你对关于IOC和依赖注入的问题得到进一步的提升,在面试的时候能从容面对面试官。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/29 15:26:07

一键部署EmotiVoice Docker镜像的操作步骤

一键部署 EmotiVoice Docker 镜像的操作步骤 在语音交互日益成为主流人机接口的今天,用户对“机器说话”的期待早已不再满足于简单的信息播报。他们希望听到更自然、更有情绪、甚至带有“人格感”的声音——无论是陪伴型AI助手的一句温柔问候,还是游戏角…

作者头像 李华
网站建设 2026/7/30 3:32:48

语音合成艺术化探索:用EmotiVoice创作声音装置

语音合成艺术化探索:用EmotiVoice创作声音装置 在一场关于“记忆”的互动展览中,观众走近一座老式留声机雕塑。它缓缓启动,播放一段低语:“那年夏天,我们还在河边捉蜻蜓。”声音温柔而略带颤抖——是怀念?…

作者头像 李华
网站建设 2026/7/29 17:29:01

7、Web应用程序漏洞检测与自动化扫描工具指南

Web应用程序漏洞检测与自动化扫描工具指南 在网络安全领域,对Web应用程序进行漏洞检测是至关重要的。本文将介绍文件包含漏洞检测、POODLE漏洞识别以及几种常用的自动化扫描工具的使用方法。 文件包含漏洞检测 文件包含漏洞通常在开发人员使用可被用户修改的请求参数来动态…

作者头像 李华
网站建设 2026/7/30 13:23:54

9、Web安全攻击技术实战指南

Web安全攻击技术实战指南 1. THC-Hydra暴力破解密码 1.1 THC-Hydra简介 THC-Hydra(简称Hydra)是一款网络登录破解工具,属于在线破解器,可通过暴力破解网络服务来查找登录密码。暴力攻击是尝试所有可能的字符组合以猜测正确密码,这种方式虽耗时,但一定能找到答案。 1.…

作者头像 李华
网站建设 2026/7/29 18:07:07

12、高级渗透测试技术与中间人攻击全解析

高级渗透测试技术与中间人攻击全解析 在渗透测试中,获取服务器的 shell 只是第一步,后续还需要进行权限提升并获取有助于测试的信息。以下将详细介绍一些高级渗透技术和中间人攻击方法。 利用 John the Ripper 通过字典破解密码哈希 在渗透测试中,从数据库提取密码哈希是常…

作者头像 李华
网站建设 2026/7/29 19:05:41

如何收集高质量音频样本用于EmotiVoice声音克隆?

如何收集高质量音频样本用于 EmotiVoice 声音克隆? 在虚拟主播实时变声、游戏角色个性化配音、亲人声音复现等应用场景中,我们常常被一个问题卡住:为什么AI克隆出来的声音“听起来像,但总觉得差了点意思”?问题往往不在…

作者头像 李华