栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring中的循环依赖

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring中的循环依赖

什么循环依赖?
比如最简单的,A依赖B,B依赖A.或者这个依赖的圈更大一些:A依赖B,B依赖C,C依赖A.

Spring解决循环依赖
其实前面提到过Spring并不是会解决所有的依赖,只有满足一定的条件的依赖才会尝试解决.
Spring容器循环依赖包括构造器循环依赖和setter循环依赖.

构造器循环依赖

通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛出BeanCurrentlyInCreationException异常表示循环依赖.
还记得之前分析的,在创建bean之前,会给当前的beanName标记一个正在创建的标志,在创建结束的时候会把这个标志去掉.
比如A依赖B,B依赖A,在创建A的时候,发现需要B,这时候会先去创建B,在创建B的时候,发现又要依赖A,在创建A的时候会发现,A已经在创建中的状态了,此时就会抛出异常.

setter循环依赖

对于setter注入造成的循环依赖是通过Spring容器提前暴露刚创建完成构造器注入但未完成其他步骤(如setter注入)的bean来完成的,而且只能解决单例作用域的bean循环依赖.
比如A依赖B,B依赖A,在创建A的时候,会根据无参构造器建造A的bean,并暴露一个ObjectFactory用于返回一个提前暴露一个创建中的bean,并标记A正在创建,然后进行setter注入B.
在setter注入B的时候,发现B还没有创建,于是重复上面的步骤,把B的bean创建,并暴露一个ObjectFactory用于提前暴露一个创建中的bean,并标记B正在创建,然后进行setter注入A.
在注入A的时候,发现有一个A的ObjectFactory,得到A得bean注入进取.此时B创建完成,于是继续A创建过程中的注入B的过程,注入完B之后,A也创建完成.

prototype范围的依赖处理

对于prototype作用域的bean,Spring容器是无法完成依赖注入的,因为Spring容器不进行缓存prototype作用域的bean,因此无法提前暴露一个创建中的bean.

  • List item
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/924972.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号