目录
[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面经系列(二)