京东一面:Spring 为何需要三级缓存解决循环依赖,而不是二级缓存?我懵了。。
共 4365字,需浏览 9分钟
· 2022-04-12
上一篇:一边裁员,一边招人。。
作者:半分、
来源:https://www.cnblogs.com/semi-sub/p/13548479.html
前言
bean生命周期
![](https://filescdn.proginn.com/682f172b50128f0302a2c8613c4a1133/69d725290611f6ffc39d047f96ea6b55.webp)
![](https://filescdn.proginn.com/7832d9e891ed5f2607686fef951f446d/257d7e42f93b96645b06e39b67cad1ab.webp)
![](https://filescdn.proginn.com/4d4bbf2e189c5da102e88d20c48c4d2f/99fe408ce0b298b775949a7a3d00753d.webp)
可以看到initializeBean方法中,首先调用的是使用的Aware接口的方法,我们具体看一下invokeAwareMethods方法中会调用Aware接口的那些方法
![](https://filescdn.proginn.com/28229b1a069e2c6fcd23fbe8ddf4bdf4/e148dd0b2a7c9394e42c30290676f161.webp)
![](https://filescdn.proginn.com/6e63ca7087ac98832417c3c56b6826a7/7e7f6d1357d8ff1acd2d7c2d07be2cf7.webp)
再看一个注意的点
![](https://filescdn.proginn.com/bcfa15a7a347da90a7f0b751a585e3ba/90d3aafb12e724464f9be1032509a024.webp)
![](https://filescdn.proginn.com/07153da846c48ca40763e5d73594d2c7/6e90376fcbfc1a07a46b72fb77644915.webp)
![](https://filescdn.proginn.com/3f99f5e7e6cb87314f08dbb33a324a7f/319e4fb78c8b24386a1e78a97ed5ca82.webp)
![](https://filescdn.proginn.com/6ba4ee63bc07ead93bbef2a7254e2e9b/0775900611ab365fdeef3a1534966ffe.webp)
![](https://filescdn.proginn.com/0fe521191eaff7ca7186924da4bcb5b1/94f7790a1244510d79c8a19b9097abe9.webp)
三级缓存解决循环依赖
上一小节对bean的生命周期做了一个整体的流程分析,对spring如何去解决循环依赖的很有帮助。前面我们分析到填充属性时,如果发现属性还未在spring中生成,则会跑去生成属性对象实例。
![](https://filescdn.proginn.com/7832d9e891ed5f2607686fef951f446d/257d7e42f93b96645b06e39b67cad1ab.webp)
我们可以看到填充属性的时候,spring会提前将已经实例化的bean通过ObjectFactory半成品暴露出去,为什么称为半成品是因为这时候的bean对象实例化,但是未进行属性填充,是一个不完整的bean实例对象
![](https://filescdn.proginn.com/d76981bc1b7836ee997a8d320b50d761/6dd9d3bcadc733044c0efabac8ecfe1c.webp)
spring利用singletonObjects, earlySingletonObjects, singletonFactories三级缓存去解决的,所说的缓存其实也就是三个Map
![](https://filescdn.proginn.com/bda121a1111981a20d56564110cbaee3/0d388806bd7c04ca493cf3cedf57a4ee.webp)
![](https://filescdn.proginn.com/8a34d31a09b9bdaa06fece005d3e2f7a/18e2a3450be4bfce0289e92f14c86ca1.webp)
![](https://filescdn.proginn.com/acffb8377d327b87271bee0d14f60c88/53d8f1acb216d3ee00233d40fcae1cb1.webp)
下面是重点,我们发现这个二级缓存好像显得有点多余,好像可以去掉,只需要一级和三级缓存也可以做到解决循环依赖的问题???
![](https://filescdn.proginn.com/ff6173501d80147b091370fec85244f0/bfc0151998c6a71c7334c3c7fe0e4eda.webp)
我们发现AService的testAopProxy被AOP代理了,看看传入的匿名内部类的getEarlyBeanReference返回的是什么对象。想成为架构师,这份架构师图谱建议看看,少走弯路。
![](https://filescdn.proginn.com/74e2282e1f21c98ebd9789c84513c1cc/c3d3bee77ff5c1eddffc0e80b3cf10d5.webp)
![](https://filescdn.proginn.com/375552996cb00fbf93108862d8d32c82/5f305ab2452e07ffb92ddfba1abba40a.webp)
![](https://filescdn.proginn.com/c2b2d7d6b79ffd921abe149473c7cef8/58fab250891263aff7e8e423d83c6e51.webp)