单例+setter模式下是没有循环依赖问题的(实例化之后就立马曝光,不等属性赋值就曝光,bean曝光之后再进行属性赋值)单例+setter模式下Spring才能解决循环依赖问题,解决的方式:这种方式可以做到将“实例化Bean”和“给Bean属性赋值”这两个动作分开去完成,实例化Bean的时候:调用无参构造方法来完成,此时可以先不给属性赋值,可以提前将“Bean”对象“曝光”给外界。给Bean属性赋值的时候调用setter方法来完成,两个步骤是完全可以分离开去完成的,并且这两步不要求在同一时间点上完成。也就是说,Bean 都是单例的,我们可以先把所有的单例Bean实例化出来,放到一个集合中(我们可以称之为缓存),所有的单例Bean全部实例化完成之后,以后我们再慢慢调用setter方法给属性赋值,这样就解决了循环依赖问题
一级缓存:存储的是完整的单例Bean对象(Bean对象属性都已经赋值了,是一个完整的对象)
二级缓存:存储的是早期的单例Bean对象,这个缓存中的单例Bean对象的属性没有赋值,只是一个早期的实例对象
三级缓存:单例工厂对象,这个里面存储了大量的“工厂对象”,每一个单例Bean对象都会对应一个单例工厂对象,这个集合存储的是,创建该单例对象对应的那个单例工厂对象