讲一讲循环依赖

循环依赖指的是两个类中的属性各自依赖对方,比如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 的流程,创建完毕

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

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值