【问题标题】:Guice Inject Field in class NullPointerException, circular dependency issue introducedGuice Inject Field in class NullPointerException,引入循环依赖问题
【发布时间】: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


【解决方案1】:

试试这个,希望对你有帮助。

public class Evaluator {
  @Inject public Evaluator(Operator op) {
    // ...
  }
}
public class Operator {
  @Inject public Operator(map m) {
    // ...
  }
}
public class map {
  @Inject public map(Provider<Evaluator> EvaluatorProvider) {
    // ...
  }
}

【讨论】:

    【解决方案2】:

    在这种循环依赖的情况下,Guice 不够聪明,无法帮助注入依赖,你可以专门要求 Guice 为这个类注入依赖。

    @Provides @Singleton
    public Operator operator(final Catalog catalog) 
    {
        return new Operator(catalog);
    }
    

    然后injector.injectMembers(injector.getInstance(Operator.class)) 将帮助注入所需的依赖项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多