简单对象指的是 实例化后还没有属性注入的时候的早期bean
lambda表达式用于判断a是否存在aop代理
假如a和b循环依赖,a实例化时,
bean创建流程如下:
0,创建一个set记录当前正在实例化的bean,
1.实例化a的简单对象时,从一级缓存寻找,没找到则开始创建,首先把a的lambda表达式放入三级缓存,并在set中标识a正在创建
2.填充a中属性b的时候,去一级缓存寻找b的实例,如果没找到,则创建b的实例化简单对象,并把b的lambda表达式放入三级缓存,并在set中标识b正在创建,然后为b属性注入,发现存在为a的属性,先去一级缓存找a,没找到,又通过set发现a正在创建,则判断出a和b存在循环依赖,然后去二级缓存寻找a,也没找到,最后去三级缓存中取出a的lambda表达式,判断a是否存在aop代理,如果存在aop代理,则生成a的代理对象放入二级缓存,否则生成a的普通对象放入二级缓存,并删除三级缓存中的a。 b属性注入完毕后初始化完成,将b的实例存入一级缓存。删除其他缓存中的b。
3.经过b的创建后,创建c时,如果a和c也循环依赖,则填充c中的a属性时,可直接从二级缓存取出a。c属性注入完毕后初始化完成,将c的实例存入一级缓存。删除其他缓存中的c。
4.a得到b和c后,最后填充完其他属性后,把a的实例(普通或代理),通过二级缓存get(beanName)后存入一级缓存,并从二级缓存删除
@Lazy注解解决循环依赖:
由spring直接注入属性的代理对象,从而解决循环依赖