技术文摘
Spring 循环依赖全图解,从此无惧面试提问
Spring 循环依赖全图解,从此无惧面试提问
在 Spring 框架的应用中,循环依赖是一个较为复杂但又常见的问题。理解和解决循环依赖对于开发者来说至关重要,尤其是在面试中,这往往是一个高频考点。
我们来明确什么是循环依赖。简单来说,当两个或多个 Bean 之间相互依赖,形成一个闭环时,就产生了循环依赖。比如,A 依赖于 B,B 又依赖于 A,这就是一个典型的循环依赖场景。
为了更清晰地理解循环依赖,我们通过一个示例来进行图解。假设有两个 Bean,BeanA 和 BeanB。BeanA 中需要注入 BeanB 的实例,而 BeanB 中又需要注入 BeanA 的实例。
在 Spring 中,解决循环依赖主要依靠三级缓存。一级缓存是 singletonObjects,用于存放完全初始化好的单例 Bean;二级缓存是 earlySingletonObjects,存放早期曝光的单例 Bean;三级缓存是 singletonFactories,存放生成单例 Bean 的工厂对象。
当创建 BeanA 时,首先会在一级缓存中查找,如果没有找到,就创建 BeanA 的实例,并将其放入三级缓存。接着创建 BeanB 时,同样的流程,在找不到的情况下创建实例并放入三级缓存。
当 BeanB 尝试注入 BeanA 时,会从三级缓存中获取 BeanA 的工厂对象,通过工厂对象获取早期曝光的 BeanA 对象,完成 BeanB 的初始化。然后将 BeanB 放入二级缓存,最后完成 BeanB 的全部初始化并放入一级缓存。
接着处理 BeanA 的依赖注入,此时可以从二级缓存中获取已经初始化了部分的 BeanB,完成 BeanA 的初始化,并放入一级缓存。
通过这样的三级缓存机制,Spring 巧妙地解决了循环依赖的问题。
深入理解 Spring 中的循环依赖对于提升我们的技术水平和应对面试都有着重要意义。通过以上的全图解分析,希望能让您对 Spring 循环依赖有更清晰、更透彻的认识,在面试中能够自信应对相关问题。
TAGS: Spring 框架 Spring 循环依赖 面试提问 无惧面试
- 小团队微服务落地实践参考
- GitHub 吐槽数据库遭腾讯小米等封杀 加班或致头秃
- 京东「卖家日志」系统的构建及流式计算日志系统应用实践
- 法国程序员不存在“996” 40 多岁备受尊敬
- PHP 安全问题初探:10 个常见安全问题及实例剖析
- 软件架构的 10 个常见模式浅析
- 巧用 console 使 js 调试轻松化
- 程序员抵制 996 ,创建 955.WLB 不加班公司名单登上 GitHub 周榜第二
- 程序员发量与薪资的关联:你今天脱发了吗?
- 免费数学神器:照片转 LaTeX,再复杂公式也不怕
- 996 工作易致病入 ICU?央视财经聚焦年轻人奋斗之路
- Elasticsearch 原理终于被讲透
- Java 12 已发布,影响 Java 未来的三大关键项目!
- 程序员爸爸抵制教孩子学编程:“我不会”
- 前端性能监控深度解析