阿里面试官居然不懂Spring是如何解决循环依赖的?

简介: 阿里面试官居然不懂Spring是如何解决循环依赖的?

BeanPostProcessor的after方法中会完成动态代理对象的创建。



在创建代理对象之前,是否需要原始对象?

需要原始对象!


若刚开始先创建了原始对象,然后又创建了代理对象,则对外暴露引用时,应该用原始对象还是用代理对象呢?

程序是写死的,没那么智能,说要判断用什么对象,所以我们需要保证,当bean需要被引用时,必须给出一个最终的结果:要么是原始对象,要么是代理对象,当生成代理对象时,原始对象会被覆盖掉。


怎么确定对象什么时候对外暴露或者说对外引用呢?

无法确定!所以有了三级缓存这个骚操作!有了三级缓存,每次在创建完对象后,不是直接把对象放到一级或二级缓存,而是先将一个lambda表达式放到三级缓存中,当需要被引用时,会优先从三级缓存中获取到lambda,然后根据lambda表达式处理结果判断到底是原始对象还是代理对象。

getEarlyBeanReference在此方法中已唯一确定了对外暴露的对象到底是原始对象还是代理对象。



当Bean产生循环依赖时,比如BeanA的构造方法依赖BeanB作为成员需要注入,BeanB也依赖BeanA,你觉得会出现什么问题呢?又有哪些解决方式呢?


通过set方法去处理,背后的原理其实是缓存。

主要解决方式:使用三级缓存


singletonObjects: 一级缓存, Cache of singleton objects

bean name --> bean instance


earlySingletonObjects: 二级缓存, Cache of early singleton objects

bean name --> bean instance 提前曝光的BEAN缓存


singletonFactories: 三级缓存, Cache of singleton factories

bean name --> ObjectFactory。需要的对象被代理时,就必须使用三级缓存(否则二级就够了)。解决循环依赖中存在aop的问题


spring中已经有了循环依赖的解决方案,为什么项目中还会出现循环依赖的问题?

spring中现有的解决循环依赖问题的方案只是一种预防机制, 当符合此情况的时候可以解决,但是在实际的场景中会存在很多不匹配的情况,构造器的循环依赖是无法解决的!



带着aop的实现来重新走一下刚刚执行的逻辑, 体会各个对象在程序运行过程中的流转过程,对象的三个缓存中的迁移过程,画个图,总结下,debug下,

起始断点的入口在:finishBeanFactorylnitialization方法。


image.png

目录
相关文章
|
6月前
|
存储 关系型数据库 MySQL
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
|
5月前
|
监控 Java 数据安全/隐私保护
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
|
7月前
|
监控 安全 Java
解决 Spring Boot 中 SecurityConfig 循环依赖问题的详解
本文详细解析了在 Spring Boot 中配置 `SecurityConfig` 时可能遇到的循环依赖问题。通过分析错误日志与代码,指出问题根源在于 `SecurityConfig` 类中不当的依赖注入方式。文章提供了多种解决方案:移除 `configureGlobal` 方法、定义 `DaoAuthenticationProvider` Bean、使用构造函数注入以及分离配置类等。此外,还讨论了 `@Lazy` 注解和允许循环引用的临时手段,并强调重构以避免循环依赖的重要性。通过合理设计 Bean 依赖关系,可确保应用稳定启动并提升代码可维护性。
623 0
|
4月前
|
负载均衡 架构师 Cloud Native
阿里面试:服务与发现 ,该选 CP 还是 AP?为什么?
阿里面试:服务与发现 ,该选 CP 还是 AP?为什么?
阿里面试:服务与发现 ,该选  CP 还是 AP?为什么?
|
5月前
|
设计模式 算法 架构师
京东二面:说下spring中常用的设计模式? (一个 深入骨髓的答案, 面试官跪下了)
京东二面:说下spring中常用的设计模式? (一个 深入骨髓的答案, 面试官跪下了)
京东二面:说下spring中常用的设计模式? (一个 深入骨髓的答案, 面试官跪下了)
|
10月前
|
前端开发 安全 Java
2025春招,Spring 面试题汇总
本文详细整理了2025年春招必备的Spring面试题,分为基础和高级两大部分,帮助求职者全面掌握Spring相关知识点,结合实际项目经验,提升面试成功率。内容涉及Spring框架、AOP、事务管理、数据库集成、Spring Boot、Spring Security、微服务架构等,助力你在春招中脱颖而出。
2170 0
|
5月前
|
SQL Java 数据库连接
阿里腾讯互联网公司校招 Java 面试题总结及答案解析
本文总结了阿里巴巴和腾讯等互联网大厂的Java校招面试题及答案,涵盖Java基础、多线程、集合框架、数据库、Spring与MyBatis框架等内容。从数据类型、面向对象特性到异常处理,从线程安全到SQL优化,再到IOC原理与MyBatis结果封装,全面梳理常见考点。通过详细解析,帮助求职者系统掌握Java核心知识,为校招做好充分准备。资源链接:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
186 2
|
10月前
|
监控 Kubernetes Java
阿里面试:5000qps访问一个500ms的接口,如何设计线程池的核心线程数、最大线程数? 需要多少台机器?
本文由40岁老架构师尼恩撰写,针对一线互联网企业的高频面试题“如何确定系统的最佳线程数”进行系统化梳理。文章详细介绍了线程池设计的三个核心步骤:理论预估、压测验证和监控调整,并结合实际案例(5000qps、500ms响应时间、4核8G机器)给出具体参数设置建议。此外,还提供了《尼恩Java面试宝典PDF》等资源,帮助读者提升技术能力,顺利通过大厂面试。关注【技术自由圈】公众号,回复“领电子书”获取更多学习资料。