技术文摘
高频面试之 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 框架以及在面试中出色表现都具有重要意义。通过对三级缓存机制的理解,我们能够更好地应对开发中可能出现的循环依赖问题,并在面试中清晰准确地阐述相关原理和知识。
- 飞桨 PaddleFleetX 大模型开发套件首发 一站式解决大模型生产
- 微服务内的鉴权如何进行?
- 同事总吐槽我接口性能差 真凶竟在这
- 架构瓶颈原则:注意力 probe 对神经网络组件提供句法信息的估计
- 2022 裁员过后,我所总结的程序员必备架构能力
- Node.js C++ 层任务管理
- 一日一技:元组列表的排序,先按首元素升序再按次元素降序
- 深入解析 Java 并发里的有序性问题与解决途径
- 年底裸辞,我用七张图准备 ZK 分布式锁面试
- 2023 年 15 个优质 JavaScript 框架值得选
- API 开发:gRPC 与 GraphQL 之选
- C++ 与 Python 中二分查找的实现方法
- 面试官对 Net/Http 库的提问:能否阐述其优缺点?
- Maven 至 Gradle 的轻松迁移操作
- 优质互动式文章:Framer Motion 布局动画