java - 如何将引用模块中字段的匿名 Provider 移动到单独的类中?

标签 java guice inner-classes

玩具示例:

public class MyModule extends AbstractModule {
  private static final Foo foo;

  public MyModule(Foo foo) {
    this.foo = foo;
  }

  @Override
  public void configure() {
    bind(Bar.class).toProvider(new Provider<Bar>() {
      @Override public Bar get() {
        return foo.getBar();
      }
    });
  }
}

这让我可以延迟调用存储在 MyModule 字段中的用户提供的 Foo 实例的 .getBar() 方法。但是现在 provider has its own dependencies - 因此我需要定义一个非匿名类,我在上面指定了一个 @Inject 构造函数。像这样的东西:

public class MyModule extends AbstractModule {
  private static final Foo foo;

  public MyModule(Foo foo) {
    this.foo = foo;
  }

  @Override
  public void configure() {
    bind(Bar.class).toProvider(BarProvider.class);
  }

  BarProvider implements Provider<Bar> {
    private Baz baz;

    @Inject BarProvider(Baz baz) {
      this.baz = baz;
    }

    @Override public Bar get() {
      return foo.getBar(baz);
    }
  }
}

完美!除了 Guice doesn't like this ...

Exception in thread "main" com.google.inject.CreationException: Unable to create injector, see the following errors:

1) Injecting into inner classes is not supported. Please use a 'static' class (top-level or nested) instead of com.example.MyModule$BarProvider.

所以,我陷入了困境。我需要同时访问模块上的字段和来自 Provider 类的注入(inject)类型。有什么办法吗?


注意:这个玩具示例排除了一些实际的复杂性 - 特别是 bind() 语句涉及更多,这就是为什么我不能简单地定义一个@Provides 方法。

最佳答案

在某种程度上,注入(inject)内部类是不可能的,因为 Guice 无法在没有外部父实例的情况下反射性地创建内部实例(相当于神秘的 outerInstance.new InnerInstance() 语法)。

一些选项:

  • 让 Foo 可以通过你的图表注入(inject),可能隐藏在 PrivateModule 中因此它不会暴露给您的整个图表(如果这对您很重要)。
  • 使用匿名内部提供者(或提取的等效项),并获得 Provider<Baz>来自 AbstractModule 的 getProvider(Class<T>) 方法。如果您尝试在创建 Injector 之前调用它,您将得到一个异常,但对于按照您正在做的方式创建 Provider,这可能不是问题。
  • 发布您的 bind外面有玩具问题,看能否@Provides有点聪明是可能的。

相关:Accessing Guice injector in its Module?

关于java - 如何将引用模块中字段的匿名 Provider 移动到单独的类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42015063/

相关文章:

java - Google Guice 中的条件匹配

java - Guice:辅助注入(inject)和提供者

java - 与 Guice 0 耦合获取多个新实例

java - 如何在Java中引用列表中的内部类

java - 按照拍摄图像的顺序从图库加载图像?

java - 我们可以通过发送包含 2 个以上用户信息的 json 数组在 Keycloak 中创建用户吗?

java - 将二维数组复制到一维数组

java - rdiff-backup java 运行时执行远程多参数问题

java - 从构造函数中公开 "this"的引用

java - 不理解嵌套类型