使用三级缓存解决循环依赖问题
1.三级缓存里都存放着什么?
1.成品对象
2.半成品对象(未初始化)
3.lambda表达式
2.如果只是用一级缓存行不行?
不行,因为成品和半成品对象会放在一起,在进行对象获取的时候可能获取到半成品对象,这样的对象是没法使用的
3.如果只有二级缓存行不行?
只有二级缓存的时候也可以解决循环依赖问题,但是添加AOP的实现之后,报错:没有使用最终版本的bean对象。
4.三级缓存存在做了什么事?
lambda.getEarlyBeanReference(),在当前方法中,有可能会用代理对象替换非代理对象,如果没有三级缓存的话,就无法拿到非代理对象。换句话说,在整个容器中,包含了同名对象的代理对象和非代理对象,这样肯定是不行的。容器中,对象都是单例的,意味着根据名称只能获取一个对象的值,此时同时存在两个对象的话,使用的时候应该取哪一个?无法判断,谁也无法确定什么时候会调用当前对象,是在其他对象的执行过程中进行调用的,而不是人为指定的,所以必须要保证容器中任何时候都只有一个对象供外部调用,所以在三级缓存中,完成了一件代理对象替换非代理对象的工作,确定返回的是唯一对象。
三级缓存是为了解决在AOP代理过程中产生的循环依赖问题,如果没有AOP的话,二级缓存足以解决循环依赖问题。
其实相当于一个回调机制,当我需要使用当前对象时,会判断当前对象的是否需要被代理实现,如果需要,则直接替换,不需要则直接返回代理对象即可。