讲一讲循环依赖

循环依赖指的是两个类中的属性各自依赖对方,比如A类中有B属性,B类中有A属性,

这样子就造成了spring在实例化其中一个类A的时候,填充属性的时候要去实例化另外一个类B,而填充另外一个类B属性A的时候又发现需要原来的那个类A,导致循环引用, 无限创建

 

 

Spring中利用缓存机制解决循环依赖问题,但仅限于单例情况,因为多例没有缓存实例,所以无法解决,直接抛出异常

从代码层面上,假设创建类A,首先从getBean开始,调用dogetbean,分析一下别名,然后getSingleton 发现此时的单例池找不到,而且也不是创建中的对象,于是返回null

返回null会去ParenBeanFactory中找,如果没有,就进行mergeBeanDefinition

接着调用getSingleton另外一个重载方法,传入beanName和ObjectFactory,其中进行了实例化前的准备,如写入正在创建的类缓存,调用相关的后置处理器

然后调用ObjectFactroy中的getObect,getObject调用了createBean,createBean调用了docreatebean,接着调用createinstance,

其中根据条件判断调用工厂方法,或者指定参数的构造方法或者默认的构造方法进行反射创建对象,然后将创建好的对象包装ObjectFactory调用addSingletonFactory放进缓存,这里就是解决循环依赖的缓存

 

接着调用populateBean进行属性赋值,发现依赖另外一个类B,于是继续调用getBean,走一遍上面的流程,到populateBean属性赋值,发现需要创建A,于是再调用getBean(A)

此时调用getSingleton在singletonFactoies就能找到一开始创建A的时候加进SingleFactory中的ObejectFactory,直接返回,接着走完创建B的流程返回,接着走完创建A 的流程,创建完毕

成功解决循环依赖的情况.

 

你可能感兴趣的:(5.Spring,spring)