什么循环依赖?
比如最简单的,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



