面试题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的依赖注入完成对这些类的有效管理。