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