Spring容器将每一个<b>正在创建的bean</b>标识符放在一个"当前创建bean池"中,bean标识符在创建过程中将一直保持在这个池中,因此如果在创建bean过程中发现自己已经在"当前创建bean池"里时,将抛出BeanCurrentlyInCreationException异常表示循环依赖;而对于创建完毕的bean将从"当前创建bean池"中<b>清除</b>掉。
spring会先调动构造器生成这样一个还未完成基本属性注入的EarlyBeanReference,放到创建池中,当使用setter注入循环依赖属性时,使用这个还未完全完成注入的bean就行了,所以setter注入(单例下)spring是能自己解决循环依赖问题的。而构造器注入spring没办法自动解决这个循环依赖。在非单例模式下,spring也不会缓存bean,所以也不能自动解决依赖注入问题。
addSingletonFactory(beanName, new ObjectFactory() {
public Object getObject() throws BeansException {
return getEarlyBeanReference(beanName, mbd, bean);
}
});
- 日常开发中,遇到循环依赖问题我都是不使用autowired注入,而是通过postconstruct注解用一个init方法手动注入。