一级缓存:存放完全初始化好的bean对象
二级缓存:仅创建了实例对象,未初始化好,没赋值的半成品对象
三级缓存:object factory通过getobject()方法可返回bean对象
用二级缓存可以解决普通对象的的循环依赖问题,但如果循环依赖的是aop增强的代理对象,代理对象是在对象初始化的最后才会生成,无法在二级缓存中获得,因此需引入三级缓存,三级缓存中是object factory,如果是代理对象,getobject就会返回增强后的代理对象
但三级缓存只能解决一般情况下的循环依赖,如果是构造函数注入,在创建实例对象时就发生了循环依赖则无法解决:
可采用@lazy注解懒加载构造方法中的依赖对象