DerekYRC / DerekYRC/mini-spring
有代理对象解决循环依赖这节内容有些不理解的内容
- Dominant language
- Java
- Stars
- 6.4k
- Forks
- 1.4k
- PR merge metrics
- No merged PRs in 30d
Description
作者大大好,整个项目快看到尾声了,在这节内容上有些问题。
分支:circular-reference-with-proxy-bean
1. 解决有代理对象的循环依赖问题,因为上一节中,singletonObjects(一级缓存)和earlySingletonObjects(二级缓存)没办法解决有代理对象循环依赖的问题,所以这节中引入了singletonFactory(三级缓存),在代码中的体现就是`AbstractAutowireCapableBeanFactory#doCreateBean()`方法,这个方法在75行的时候,通过bean复制一个finalBean对象,然后放入singletonFactories三级缓存中,接着在第104行通过`getSingleton(beanName)`这个方法就是会先从一级缓存找,然后接着二级缓存找,最后再三级缓存中找,对应到项目实际debug的过程中,实际上从三级缓存中去获取,就是调用了`singletonFactory.getObject()`该方法。也就是上面75行存入的三级对象的getObject方法,最终返回这个代理对象。这是我的理解。那这样的话问题就来了,就是在整个bean的生命周期,还有其他很多的操作步骤,比如BeanPostProcessor修改属性值,填充属性,以及初始化前后的处理,那么实际上对应的代码就是刚刚上面提到75行和104行中间的很多操作步骤。也就是说我们最终获取到的代理bean是根据一开始75行存入三级缓存中的finalBean。而在这个之后,代码中的很多步骤都是对原先bean去做的操作。那75-104行在bean生命周期内所做的操作岂不是对代理对象都不生效了?那代理对象的属性什么的设置是不是就都有问题了。
2. 另一个问题还是在doCreateBean()方法内,就是获取到代理对象后,105行的代码`addSingleton(beanName, exposedObject)`,这里紧接着将对象放入一级缓存中,并将二级三级缓存进行清空,结合104行的代码,整个过程看起来像是获取到代理对象后,先放入二级缓存中,然后将三级缓存中的清空,接着再放入一级缓存中,再将二级三级缓存清空。所以这里看起来好像放入二级缓存中什么也没操作,那不如直接放入一级缓存,因为放入二级缓存后什么都没操作就又取出来放入一级缓存中了,这里不是太理解。
这节内容debug过程中很多嵌套的,所以理解起来不是很容易,可能自己陷入了某个单独流程上,没办法从整体上去理解。再次感谢作者,学习到了很多东西
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.