如果没有注入构造函数,Guice的方法注入是否有效?

时间:2015-02-10 11:27:39

标签: java guice

我有一个类,我需要注入一个变量,但构造函数不是注入的。

public class Foo{
  private boolean x;
  public Foo(){
     //sets some variables
  }

  @Inject
  public void setX(boolean x){
     this.x=x;
  }
}

x的值没有被注入。是否有必要在构造函数中使用注入来识别方法注入? 我是否需要从其他类中调用此方法才能使其正常工作? Thanx提前

1 个答案:

答案 0 :(得分:4)

如果您要将Guice用于@Inject Foo,那么Guice需要创建对象 - 来自注入器或来自单独类中的另一个@Inject点。 Guice无法帮助您注入它没有创建的对象。

在这种情况下,没有必要将@Inject添加到构造函数中,因为Guice可以自动注入无参数构造函数。例如:

public class MethodInjectionTest {

  static class Foo {
    private boolean x;
    public Foo(){
      //sets some variables
    }

    @Inject
    public void setX(boolean x){
      this.x=x;
    }
  }

  Injector i = Guice.createInjector(new AbstractModule() {
    protected void configure() {
      bind(Boolean.class).toInstance(Boolean.TRUE);
    }
  });

  @Test
  public void methodInjection() {
    Foo foo = i.getInstance(Foo.class);
    assertThat(foo.x, is(true));
  }

  // EDIT: An example based on the comment by @JeffBowman
  @Test
  public void memberInjection() {
    Foo foo = new Foo();
    i.injectMembers(foo);
    assertThat(foo.x, is(true));
  }

}

如果您的真实世界类需要在构建期间将Guice控制的依赖项与客户端提供的依赖项混合,请查看assisted inject