如何在 Google Guice 中创建一个实现实例

How to create an instance of an implementation in Google Guice

我是 Google Guice 的新手,需要一点帮助。我创建了一个这样的模块:

public interface Foo {
  Bar doSomething();
}

public class MyFoo implements Foo {
  Bar doSomething() {
    // create an instance of MyBar
  }
}

public interface Bar {
  void run();
}

public interface MyBar implements Bar {
  void run();
}

public class MyModule extends AbstractModule {

  @Override
  protected void configure() {
    bind(Foo.class).to(MyFoo.class);
  }      
}

我的问题是:在 class "MyFoo" 中创建 MyBar 实例的正确方法是什么?只是这样做感觉不对:

public class MyFoo implements Foo {
  Bar doSomething() {
    MyBar mybar = new MyBar();
    return mybar;
  }
}

有没有办法在我需要时通过 MyModule 注入一个新的 MyBar 实例,或者我是否必须在 MyBar 的构造函数中注入一个工厂来创建 MyBar 实例? 如果我必须使用工厂,我可以控制通过模块生成哪个实现吗?

您可以使用 Setter 或构造函数 Injection ,如下所示:

public class MyFoo implements Foo {

    //constructor based injector
    @Inject
    public MyFoo(MyBar myBar){
        this.myBar=myBar;
    }

     //setter method injector
    @Inject
    public void setBar(MyBar myBar){
        this.myBar=myBar;
    }

    Bar doSomething() {
    // create an instance of MyBar
  }
}

MyBar 在你的情况下是一个 Interface which can not be instantiated ,你必须为其提供具体的实现,然后绑定你的 Module 并通过Setter 或如上所述的构造函数注入。

Setter 注入示例:

MyModule.java

import com.google.inject.AbstractModule;

public class MyModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(Foo.class).to(MyFoo.class);
        bind(Bar.class).to(MyBar.class);
    }
}

MyBar.java

public class MyBar implements Bar {

    public void run() {
        System.out.println("Hello Bar");
    }
}

MyFoo.java

import com.google.inject.Inject;

public class MyFoo implements Foo {
    private Bar bar;

    // setter method injector
    @Inject
    public void setBar(Bar myBar) {
        this.bar = myBar;
    }

    public Bar doSomething() {
        return bar;
    }
}

也许您正在寻找供应商?提供商或多或少是工厂,它们是 Guice API 的一部分,因此您不必实施它们。

public class MyFoo implements Foo {
  @Inject Provider<MyBar> myBarProvider;

  Bar doSomething() {
    return myBarProvider.get(); // returns a new instance of MyBar
  }
}

详情见https://github.com/google/guice/wiki/InjectingProviders