Spring使用三级缓存解决循环依赖问题的原因

前言

三级缓存的含义及背景请自行百度

问1:为什么会有二级缓存?

使用1级和3级也能解决循环依赖问题,但是:如果一个对象被依赖两次以上(a引b,b引c和a,c引a,abc均使用了aop),此时如果只用1和3级缓存就存在以下问题:
b中拿到三级缓存的工厂调用getObject()创建a的代理对象,c中也会拿到三级缓存的工厂调用getObject()创建a的代理对象,由于getObject()每次创建的代理对象不同,就违反了单例原则。如果存在第二级缓存,b拿到缓存工厂创建a的代理对象后,后续会放到二级缓存,而c只需要从二级缓存中直接就可以拿到a的同一个代理对象。

问2:为什么会有三级缓存?

使用1级和2级缓存也能解决循环依赖问题,但是使用AOP时也会有以下问题:
a引b,b引a,a进二级缓存;然后初始化b,b使用a暴露的对象(二级缓存),b初始化完毕封装成代理对象;继续初始化a,a完成。此时,a中引用的是代理后的b,而b中引用的是原始对象a。这个时候,对a对象使用aop就会出现问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容