阿里面试官居然不懂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

目录
相关文章
|
17天前
|
人工智能 Java Spring
Spring Boot循环依赖的症状和解决方案
Spring Boot循环依赖的症状和解决方案
|
22天前
|
Java Spring
Spring面试题pro版-5
Spring面试题pro版-5
14 0
|
22天前
|
Java Spring
Spring面试题pro版-4
Spring面试题pro版-4
15 0
|
4天前
|
监控 Java 数据库连接
总结Spring Boot面试知识点
Spring Boot是一个基于Spring框架的开源项目,它简化了Spring应用的初始搭建以及开发过程。通过提供“约定优于配置”的方式,Spring Boot可以帮助开发者快速构建出生产级别的Spring应用。
12 0
|
4天前
|
缓存 Java 开发工具
【spring】如何解决循环依赖
【spring】如何解决循环依赖
8 0
|
12天前
|
存储 缓存 Java
【Spring系列笔记】依赖注入,循环依赖以及三级缓存
依赖注入: 是指通过外部配置,将依赖关系注入到对象中。依赖注入有四种主要方式:构造器注入、setter方法注入、接口注入以及注解注入。其中注解注入在开发中最为常见,因为其使用便捷以及可维护性强;构造器注入为官方推荐,可注入不可变对象以及解决循环依赖问题。本文基于依赖注入方式引出循环依赖以及三层缓存的底层原理,以及代码的实现方式。
23 0
|
16天前
|
存储 缓存 Java
【spring】06 循环依赖的分析与解决
【spring】06 循环依赖的分析与解决
9 1
|
22天前
|
设计模式 安全 Java
Spring面试题pro版-6
Spring面试题pro版-6
18 0
|
2月前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
53 0
|
2月前
|
缓存 安全 Java
Spring Boot 面试题及答案整理,最新面试题
Spring Boot 面试题及答案整理,最新面试题
137 0