依赖注入面试题分析—Spring面经系列(一)

目录

[1 .Spring 框架提供了哪几种依赖注入类型,推荐使用哪种注入类型?](#1 .Spring 框架提供了哪几种依赖注入类型,推荐使用哪种注入类型?)

[2 .Spring 中 Bean 的作用域有哪些,如何正确选择作用域?](#2 .Spring 中 Bean 的作用域有哪些,如何正确选择作用域?)

[3 .如果针对某个接口你需要提供多个实现类,但又希望它们都能够被注入到 Spring IoC 容器中,你有什么办法?](#3 .如果针对某个接口你需要提供多个实现类,但又希望它们都能够被注入到 Spring IoC 容器中,你有什么办法?)

[4 .如果想要加快 Spring IoC 容器的启动时间,你有什么办法?](#4 .如果想要加快 Spring IoC 容器的启动时间,你有什么办法?)

[5.Spring Bean 的注册流程是怎么样的?](#5.Spring Bean 的注册流程是怎么样的?)

[6.Spring Bean 的实例化过程包含哪些核心步骤?](#6.Spring Bean 的实例化过程包含哪些核心步骤?)

[7 .Spring 如何解决循环依赖问题?](#7 .Spring 如何解决循环依赖问题?)

[8 .如果业务代码出现了循环依赖,有哪些应对的解决方案?](#8 .如果业务代码出现了循环依赖,有哪些应对的解决方案?)


1 .Spring 框架提供了哪几种依赖注入类型,推荐使用哪种注入类型?

答案: Spring 框架分别提供了基于字段、构造器和 Setter 方法的这三种依赖注入类型,
其中, Spring 官方推荐使用的是构造器注入类型。

2 .Spring 中 Bean 的作用域有哪些,如何正确选择作用域?

答案: Spring 中 Bean 的作用域常见的有单例和原型两种,默认是单例。在选择作用域
时,基本原则就是对于有状态的 Bean ,我们应该使用原型作用域,反之则应该使用单例作
用域。

3 .如果针对某个接口你需要提供多个实现类,但又希望它们都能够被注入到 Spring IoC 容器中,你有什么办法?

答案:默认情况下, Spring IoC 容器在启动时不允许某个接口存在多个实现类,但我们
可以通过 @Primary 注解来设置主实现类。另一方面,我们还可以使用 @Qualifier 注解来为
不同的实现类进行命名,从而根据不同的名称来注入目标对象

4 .如果想要加快 Spring IoC 容器的启动时间,你有什么办法?

答案:针对这个问题,基本思想就是减少容器启动时所需要初始化的 Bean 的数量。我
们可以从三个方面来回答这个问题,首先通过 @ComponentScan 注解来控制组件扫描的范围,
然后通过合理设置 Bean 的作用域来降低大对象的创建成本。最后,我们还可以使用延迟加
载机制来控制 Bean 的初始化时机。

5.Spring Bean 的注册流程是怎么样的?

答案: Bean 的注册流程主要围绕 BeanDefinition 对象展开,包含构建 BeanDefinition 、
设置 BeanDefinition 属性以及注册 BeanDefinition 等步骤。这个流程中涉及到
ApplicationContext 和 BeanFactory 这两个 Spring IoC 容器中核心组件之间的协作和交互。

6.Spring Bean 的实例化过程包含哪些核心步骤?

答案: Spring 中 Bean 的实例化过程包含三大步骤,即基于构造器的反射方法创建 Bean 、
通过属性注入实例化 Bean ,以及通过回调机制扩展 Bean 。 Bean 的分阶段实例化过程对于解
决循环依赖也有紧密关联。

7 .Spring 如何解决循环依赖问题?

答案:三级缓存机制是 Spring 用来解决循环依赖问题的基本方法。结合 Bean 实例化的
生命周期,需要理解这种方法无法解决基于构造器注入的循环依赖,而只能应用于 Setter 注
入的应用场景。

8 .如果业务代码出现了循环依赖,有哪些应对的解决方案?

答案:消除循环依赖的策略有很多,其中通过调整类与类之间的协作关系可以很好地把
循环依赖调整为间接依赖。在日常开发过程中,提取中介者、转移业务逻辑以及引入回调机
制都是非常常见的解决方案。通常,这些方案能够运作的前提还是合理的提取业务接口,并
通过 Spring 的依赖注入完成对这些类的有效管理。
下篇更新:AOP 面试题分析---Spring面经系列(二)

相关推荐
lang201509281 分钟前
Java SAX 流式解析全解:从原理到 EasyExcel 实战
java·前端·javascript
石榴树下的七彩鱼10 分钟前
图片去文字接口,支持去除图片中的文字(附 Python / Java / PHP / JS 示例)
java·python·php·api接口·图片去水印·ai图片修复·图片去文字
zzz_236810 分钟前
【Java基础】HashMap——为什么JDK 7扩容会死循环,JDK 8又是怎么修好的
java·开发语言
程序猿乐锅10 分钟前
JavaSE 总复习:语法到多线程全梳理
java·开发语言
Sam092710 分钟前
1 个 Java 服务可以支撑多少 SSE 连接:从线程模型到容量评估
java·人工智能·ai
云器科技11 分钟前
云器技术问答 Vol.2:揭秘通用增量计算
java·开发语言
阿维的博客日记7 小时前
Hippo4j 线程池监控平台部署手册
java·spring boot·后端
C+++Python9 小时前
详细介绍一下Java泛型的通配符
java·windows·python
JosieBook10 小时前
【数据库】时序预测能力的分级进化:TimechoAI如何让每一类用户都能精准预见未来
java·开发语言·数据库
一生了无挂11 小时前
Java处理JSON技巧教学(从基础到高阶实战全覆盖)
java·开发语言·json