Spring 如何解决循环依赖?

发布于:2024-12-19 ⋅ 阅读:(14) ⋅ 点赞:(0)

高频面试:Spring 如何解决循环依赖?

https://zhuanlan.zhihu.com/p/375308988

上面两篇文章分别是楼仔和escn

原理执行流程 

 三级缓存

首先,我需要一个Bean,怎么拿到这个bean,其实不是每次都创建,是有缓存的,先从缓存中获取,没有再创建,缓存即map<k,v>,key是beaName,value是bean。

具体如何从缓存中获取,是先从一级缓存中获取完整bean,没有再从二级缓存中获取半成品bean。

bean生命周期:实例化,属性赋值,初始化(接口),ware,beforePostProcess,afterPostProcess,使用,销毁

三级缓存

SingleObject

earlySingleObject

BeanFactory

Bean 生命周期:实例化,属性赋值,初始化

AOP

举例 A依赖B B依赖A

实例化A,属性赋值,初始化时,需要B

B也是上面流程,实例化B,属性赋值,初始化时,需要A

@不是初始化,是在前一步,属性赋值

卡在初始化上了,那边能不能先不初始化,完成实例化+属性赋值,就可以直接先用,最后再执行bean创建的后续流程。那边这个半成品(实例化+属性赋值),就是earlySingleObject,二级缓存。成品就是SingleObject,一级缓存。

如果只有一级缓存呢

同时存earlySingleObject和SingleObject,这时候会出现一个问题,其他线程获取bean,可能错误的获取到半成品,解决方案是,对一级缓存加锁,又导致,性能问题。

为什么需要二级缓存

就是为了解决性能问题,获取bean先从一级缓存获取,没有再从二级缓存获取,一级缓存不加锁,加锁下沉到二级缓存。

为什么需要三级缓存呢,因为AOP

AOP需要创建代理对象,前提需要在完整的原对象中(代理对象的创建(通常)是在bean初始化完成之后进行(通过BeanPostProcessor后置处理器))

bean创建流程

getBean(BeanFactory)
getBean(AbstractBeanFactory(实现类)

  getSingleton(DefaultSingletonBeanRegistry)

createBean(AbstractBeanFactory)
doCreateBean(AbstractAutowireCapableBeanFactory)

getBean - doGetBean - getSingleton(依次从三级缓存中获取bean) - createBean - doCreateBean

-


创建bean源码

doCreateBean源码 

去字节面试,直接让人出门左拐:Bean 生命周期都不知道!

Object sharedInstance = this.getSingleton(beanName);

先从缓存获取 

 没有再创建

 

这里创建bean 

doCreateBean源码

1,实例化 创建bean createBeanInstance

2,放入三级缓存 addSingletonFactory

3,属性赋值 populateBean

4,初始化 initializeBean

 进入 doCreateBean() 后,调用 addSingletonFactory()。

往三级缓存 singletonFactories 塞入 louzai1 的工厂对象。

进入到 populateBean(),执行 postProcessProperties(),这里是一个策略模式,找到下图的策略对象。


创建bean源码
createBeanInstance

 

 

 


网站公告

今日签到

点亮在社区的每一天
去签到