据我所知,Spring通过公开当前正在创建的每个bean的ObjectFactory
来解决循环引用问题。
我感到困惑的问题是:为什么不首先实例化每个bean,然后使用Field.set(obj,val)
填充autowire字段,为什么还要使用缓存和对象工厂使它变得如此复杂。
答案 0 :(得分:0)
循环依赖
如果您主要使用构造函数注入,则可以 创建一个无法解析的循环依赖场景。
例如:A类需要B类的实例 构造函数注入,而类B需要类A的实例 通过构造函数注入。如果为类A配置bean 和I B相互注入,Spring IoC容器检测到 这个循环引用在运行时,并抛出一个 BeanCurrentlyInCreationException。
一种可能的解决方案是编辑某些类的源代码 由setter而不是构造函数配置。或者,避免 构造函数注入和仅使用setter注入。换一种说法, 虽然不推荐,但您可以配置循环 与setter注入的依赖关系。
与典型案例(没有循环依赖关系)不同,是一个循环 bean A和bean B之间的依赖关系强制其中一个bean 在完全初始化之前注入另一个(a 经典的鸡肉/鸡蛋情景)。