0%

spring循环依赖一(图解)

三级缓存

指的是DefaultSingletonBeanRegistry类中的三个Map

1
2
3
4
5
6
7
8
9
10
11
//一级缓存,存放初始化完成的Bean
/** Cache of singleton objects: bean name to bean instance. */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

// 二级缓存,存放已经被实例化,但是未初始化完成的Bean
/** Cache of early singleton objects: bean name to bean instance. */
private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);

//三级缓存,存储创建Bean的匿名内部类工厂对象ObjectFactory<?>,通过存储lambda表达式(() -> getEarlyBeanReference(beanName, mbd, bean)),解决创建动态代理逻辑性能,解耦 bean动态代理问题
/** Cache of singleton factories: bean name to ObjectFactory. */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

spring通过三级缓存来解决循环依赖问题

不含aop的流程图

含aop的流程图

问题

1:使用三级缓存的作用?

在三个级别的缓存中防止的对象是有区别的
一级缓存存放的是:实例化和初始化都完成的对象
二级缓存存放的是:实例化完成、初始化未完成的对象
三级缓存存放的是:实例化和初始化都未完成,存放的是创建bean的匿名内部类(函数是接口ObjectFactory传入)

2:只使用一级缓存?

​ 在并发的情况下,可能取到实例化但是未初始化的对象

3:只使用二级缓存?

​ 三级缓存存放的是生成具体对象的一个匿名内部类,这个类可能是代理类,也可能是普通的实例对象,使用三级缓存就保证了不管是否需要代理,用的都是一个对象