三级缓存逻辑
一级:终极Bean,成熟Bean
二级:未赋值的普通对象或代理类对象,避免多次创建
三级:lambda表达式,判断是否AOP然后生成未赋值的普通对象或代理对象
场景:
A {
B b;
}
B {
A a;
}
new A();
逻辑: 创建A,首先从一级缓存Map中去拿,发现拿不到,然后将A在 CreateingSet中存储,表示该Bean正在创建中,然后再把它存到三级缓存中,value是一个lambda表达式,通过lambda表达式可以判断该Bean是否AOP,然后拿到普通对象或代理对象,然后在二级缓存中也存一份,然后三级缓存中移除该lambda表达式然后进行赋值操作,赋值B,去一级缓存中查看是否有B,没有B,然后将B放到CreateingSet中,然后也存到三级缓存中,然后赋值,赋值的时候去Set中看,有,说明存在循环依赖,然后去二级缓存中找,找不到,然后再去三级缓存中找,找到后赋值。
lambda表达式:作用是判断该对象是否AOP,存储普通对象还是代理对象
二级缓存:作用在于,不会多次创建出普通对象或者代理对象