循环依赖:
处理过程:
getSingleton(A)
doCreateBean(A)
instance(A)
添加三级缓存A
populate(A)
Inject(B)
getSingleton(B)
doCreate(B)
instance(B)
添加三级缓存B
populate(B)
inject(A)
getSingleton(A)
三级缓存中获取到getEarlyReference,对A进行提前包装,把包装后的A移除3级缓存,放入耳机缓存
initlize(B):对B进行包装
完成B的初始化,添加到一级缓存,移除二三级缓存
initlize(A):发现已经包装过不再重复代理
完成A的初始化并添加到一级缓存,移除二三级缓存
返回A实例
解决循环依赖的流程:粉色代表处理getA的过程,黄色代表处理B的过程,蓝色代表获取B的时候处理A的过程
其中比较绕的就是getSingleton(beanName,singletonFactory)的递归,建议大家多读几遍代码
里面还用到了一些技巧例如AOP动态代理的实现及函数式接口的使用,
后续会把这些技巧原理的文章链接更新到这里