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。

你可能感兴趣的:(Spring使用三级缓存解决循环依赖问题的原因)