一、为什么要用三级缓存解决
1.不用一、二级缓存
方案:getBean时三级缓存和二级缓存做的事情合并,创建出代理类但没有填充属性的Bean
结论:多线程下,取到没有加载完成的Bean
2.不用二级缓存
方案:每次都用三级缓存创建代理对象
结论:B、C同时依赖A,但是通过动态代理创建出了两个不同的对象
3.不用三级缓存
方案:加入三级缓存里的逻辑直接变成 创建好代理对象后加入二级缓存
结论:最终结果是正确的,但是无论是否循环依赖了,都要在bean的初始化前调用后置处理器创建代理对象
4.三级缓存存普通对象,get的时候再产生代理
方案:就和描述一样
结论:创建代理本身就是getBean的一部分,如果这么做,会将创建bean和代理耦合起来