spring的IoC(控制反转)面试题

Spring IoC 面试题(初级 Java 开发)


题目 1:什么是 Spring 的 IoC?(必考)

⭐ 标准回答

IoC(Inversion of Control,控制反转) 是一种设计思想,

指的是 将对象的创建、依赖关系的管理和生命周期的控制从程序本身转移给 Spring 容器

开发者只需要声明依赖关系,不需要手动创建对象。


⭐ 关键词(面试官在听)

  • 控制反转
  • 对象创建交给容器
  • 解耦
  • Spring 容器

题目 2:IoC 和 DI 有什么关系?

⭐ 标准回答

IoC 是一种思想,DI(Dependency Injection,依赖注入)是 IoC 的具体实现方式

Spring 通过 DI(如 @Autowired、构造器注入、setter 注入)来实现 IoC。


⭐ 关键词

  • IoC 是思想
  • DI 是实现方式
  • @Autowired

题目 3:Spring 是如何实现 IoC 的?

⭐ 标准回答

Spring 通过 IoC 容器 来实现 IoC。

容器在启动时会扫描带有 @Component@Service 等注解的类,

将它们注册为 Bean,并在需要时自动创建对象并注入依赖。


⭐ 关键词

  • IoC 容器
  • Bean
  • 组件扫描
  • 自动注入

题目 4:什么是 Bean?Bean 是如何创建的?

⭐ 标准回答

Bean 是由 Spring IoC 容器管理的对象

Spring 在启动时会根据配置(注解或 XML)生成 Bean 定义,

对于默认的单例 Bean,会在容器启动时创建实例并放入容器中。


⭐ 关键词

  • Bean
  • 容器管理
  • 单例(singleton)

题目 5:@Autowired 的注入规则是什么?

⭐ 标准回答

@Autowired 默认是 按类型(byType)进行注入

如果只有一个匹配的 Bean,则直接注入;

如果有多个实现类,则需要使用 @Primary@Qualifier 来指定。


⭐ 关键词

  • byType
  • @Primary
  • @Qualifier
  • 多实现冲突

题目 6:如果一个接口有多个实现类,Spring 如何解决注入冲突?

⭐ 标准回答

可以通过以下方式解决:

  1. 使用 @Primary 指定默认实现
  2. 使用 @Qualifier 精确指定 Bean 名称
  3. 直接按具体实现类类型注入(不推荐)

⭐ 关键词

  • 多实现
  • 冲突
  • 精确注入

题目 7:Spring 中 Bean 默认是单例还是多例?

⭐ 标准回答

Spring 中 Bean 默认是 单例(singleton) 的,

即在整个 IoC 容器中只存在一个实例。


⭐ 关键词

  • singleton
  • 默认作用域

题目 8:@Autowired 可以用在哪些地方?

⭐ 标准回答

@Autowired 可以用在:

  • 成员变量
  • 构造器
  • setter 方法
    Spring 推荐使用 构造器注入,因为它更安全、依赖更明确。

⭐ 关键词

  • 构造器注入
  • 字段注入
  • setter 注入

题目 9:为什么使用 IoC?有什么好处?

⭐ 标准回答

使用 IoC 可以:

  • 降低模块之间的耦合
  • 提高代码的可扩展性
  • 方便单元测试
  • 统一管理对象生命周期

⭐ 关键词

  • 解耦
  • 可维护
  • 可测试

题目 10(加分题):new 对象和 Spring IoC 有什么区别?

⭐ 标准回答

使用 new 创建对象时,对象的创建和依赖关系由程序员自己控制;

使用 Spring IoC 时,对象由容器创建和管理,依赖通过注入完成,

更符合大型项目的架构设计。



面试速记版(30 秒背诵)

IoC 是控制反转,把对象创建和依赖管理交给 Spring 容器;

DI 是 IoC 的实现方式;

Bean 是由容器管理的对象;
@Autowired 默认按类型注入,多实现用 @Primary@Qualifier

相关推荐
小蒜学长7 分钟前
“喵汪联盟”宠物领养系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·宠物
程序员黑豆8 分钟前
Java字符串常量池完全指南:原理、intern()方法与性能优化最佳实践
java·前端·ai编程
AI人工智能+电脑小能手11 分钟前
大白话说Java设计模式-14-适配器模式(业务实战篇)
java·设计模式·适配器模式·系统兼容·多渠道对接
SomeB1oody13 分钟前
【RustyML入门】3.7. 循环层
开发语言·后端·机器学习·rust·教程
xbgRS3 小时前
springboot的自动装配
java·spring boot
东风破_10 小时前
ESLint 是什么?为什么你的项目需要它?
前端·后端·代码规范
嘻哈∠※10 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
卷无止境11 小时前
在 awesome-fastapi 里,哪些库值得一看?
后端·python
白狐_79811 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25812 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法