在Spring bean工厂中使用循环依赖有什么缺陷? 例如,使豆工厂A依赖于B而B依赖于A?
答案 0 :(得分:1)
如果使用setter或字段创建循环依赖项,那么实际上并没有那么多问题。如果初始化依赖于这些依赖关系,则必须在构造并注入所有bean之后执行init。
如果它们是构造函数注入的,那么很明显不可能创建结果对象。但是,例如,无论如何,你可以通过向其中一个bean注入一个“shell”代理来实现Guice:当构建一个需要B的A时,你会破解B的空传递代理,并注入它。然后你构造B,给它适当的A.然后你回到代理并将B放入代理。所以现在你没有真正的B,而是A中的B的代理。这可能是也可能不是问题。我倾向于不喜欢这个,发现结果不可预测。 (Bob“crazybob”Lee,创建了Guice及其基于注释的配置(最终为JSR 330,Spring现在也实现了),做了那个选择,并后悔。)
此外,循环依赖指向不良架构。您应该能够构建没有圆的整个代码图:依赖图应该是DAG - 有向非循环图。违反此规则时你应该收到错误! (但是,注射器显然必须尝试整理DAG,然后从叶节点开始向上运行。即使打开“不使用代理”,Guice也不会这样做,所以你随机获得即使您不需要代理也不代理。如果您打开该选项,它只是随机抛出,使选项绝对毫无价值。