1.构造器循环依赖
无法解决,只能抛出循环依赖异常
Spring把正在创建的bean定义一个标识,并且存放在一个”当前创建bean池”中,bean在创建过程中表示会一直在池中不会消失,如果该bean再次被创建时它会在池中找到自己已经在创建中,此时就会报出循环依赖异常,而对已经创建完成的bean,则会把其标识从"当前创建线程池”中删除.
2.setter循环依赖
可以解决
解决方案是Spring容器提前暴露刚完成构造器注入但未完成其他步骤的bean来完成的,而且只能解决单例作用域的循环依赖
通过提前暴露一个单例工厂方法,从而使其他bean能引用到该bean
addSingletonFactory (beanName,new ObjectFactory() {
Public Object getObject() throw BeanException{
Return getEarlyBeanReference(beanName,mbd,bean);
}
});
<bean id=“testA” class=“com.bean.TestA”>
<constructor-arg index = “0” ref=“testB”/>
<bean/>
<bean id=“testB” class=“com.bean.TestB”>
<constructor-arg index = “0” ref=“testC”/>
<bean/>
<bean id=“testC” class=“com.bean.TestC”>
<constructor-arg index = “0” ref=“testA”/>
<bean/>
过程:
1.spring容器创建单例”testA”bean 并暴露一个”ObjectFactory" 用于返回一个提前暴露一个创建中的bean,并将”testA”标识放到"当前创建bean池” 然后进行setter注入”testB"
2.spring容器创建单例”testB”bean 并暴露一个”ObjectFactory" 用于返回一个提前暴露一个创建中的bean,并将”testB”标识放到"当前创建bean池” 然后进行setter注入”testC”
3.spring容器创建单例”testC”bean 并暴露一个”ObjectFactory" 用于返回一个提前暴露一个创建中的bean,并将”testC”标识放到"当前创建bean池” 然后进行setter注入”testA",由于testA提前暴露"ObjectFactory"工厂,从而使用它返回一个提前暴露的在创建中的bean
4.最后在依赖注入"testB","testC"
3.prototype范围循环依赖
无法解决
网友评论