技术文摘
高频面试之 Spring 解决循环依赖的方法
高频面试之 Spring 解决循环依赖的方法
在 Java 开发中,Spring 框架是广泛应用的技术之一。而循环依赖是在开发过程中经常会遇到的一个棘手问题。在面试中,Spring 解决循环依赖的方法也是一个高频考点。
我们来理解一下什么是循环依赖。简单来说,当两个或多个 Bean 之间相互依赖,形成一个闭环时,就产生了循环依赖。比如 A 依赖 B,B 又依赖 A,这就是一个典型的循环依赖场景。
Spring 主要通过三级缓存来解决循环依赖问题。
第一级缓存是 singletonObjects,用于存放已经完全创建好的单例 Bean。
第二级缓存是 earlySingletonObjects,存放早期曝光的单例 Bean,这些 Bean 还没有完成属性注入等全部初始化工作。
第三级缓存是 singletonFactories,存放可以生成 Bean 的工厂对象。
当创建一个 Bean 时,如果发生循环依赖,Spring 会先从一级缓存中查找,如果没有找到,就去二级缓存中查找。如果还没有,就会尝试从三级缓存中获取对应的工厂对象,通过工厂对象创建 Bean 实例,并将其放入二级缓存。然后继续完成属性注入等初始化操作,最终将完全初始化好的 Bean 放入一级缓存。
Spring 解决循环依赖的关键在于提前曝光未完全初始化的 Bean,使得在循环依赖的场景中能够获取到正在创建中的 Bean,从而打破依赖的闭环。
还需要注意的是,Spring 对于构造器注入的循环依赖是无法解决的。因为在创建对象时,如果通过构造器注入,对象必须在构造器完成后才能创建成功,而此时如果存在循环依赖,就无法获取到正在创建中的对象。
理解 Spring 解决循环依赖的方法对于深入掌握 Spring 框架以及在面试中出色表现都具有重要意义。通过对三级缓存机制的理解,我们能够更好地应对开发中可能出现的循环依赖问题,并在面试中清晰准确地阐述相关原理和知识。