【发布时间】:2017-08-12 01:24:05
【问题描述】:
我需要在单独的库中定义的 Guice 中使用创建单例。
@RequiredArgsConstructor
public class Operator {
@NonNull private final Catalog catalog;
@Inject private Evaluator evaluator;
...
}
其中一个问题是这个类引入了循环依赖,Evaluator -> Operator -> Evaluator。我知道这不是一个好的设计,但被其他包消耗,没有简单的方法可以改变它。这个库有使用 Spring 框架创建的 bean,可以在其中处理这种循环依赖。
现在我需要在基于 Guice 的服务中创建 Operator 的实例,我在服务中创建了单例 Evaluator,但无法将单例注入 Operator。
@Provides @Singleton
public Operator operator(final Catalog catalog)
{
return new Operator(catalog);
}
@Provides @Singleton
public Evaluator evaluator(final Operator operator) {
return new Evaluator(operator);
}
由于 Operator 类正在用于基于 Spring 框架的其他服务,我不希望对其进行更改。我该怎么做才能让 Guice 能够将 Evaluator 注入 Operator?
提前感谢您的帮助!
【问题讨论】:
-
循环依赖可以通过以更原子的方式分解组件或找到更具体的组件来依赖来解决。一个常见的问题是对应用程序的依赖。当你的组件依赖于 Application 时,它是说它需要一个完整的应用程序来完成它的工作;通常情况并非如此。您的依赖项应该在具有您需要的特定功能的更具体的组件(例如环境)上。作为最后的手段,您可以通过注入 Provider
. 来解决该问题 -
@Tehmina 是的,问题是这个组件由两个服务共享,一个使用 Spring,另一个使用 Guice。 Spring 1 工作正常,但 Guice 1 无法注入依赖项。您能否提供更多有关 Provider 的信息?谢谢!
标签: java spring dependency-injection guice