【问题标题】:Does method injection with Guice work if constructor is not injected?如果没有注入构造函数,使用 Guice 的方法注入是否有效?
【发布时间】:2015-02-10 11:27:39
【问题描述】:

我有一个类,我需要在其中注入一个变量,但构造函数没有被 guice 注入。

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

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

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

【问题讨论】:

  • 向我们展示你设置的依赖关系?

标签: java guice


【解决方案1】:

如果您打算使用 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

【讨论】:

  • Guice 可以 帮助您注入它没有创建的对象,尽管它需要一个额外的步骤 (Injector.injectMembers(Object)) 并引入了一个奇怪的不一致注入的 API。仅在最奇怪的遗留案例中这样做,并且更喜欢如上所述的完全注入的实例。
  • @condit 如果构造函数确实有参数并且没有注入 Guice 怎么办?那么方法注入会起作用吗?
  • 仅当您使用@JeffBowman 提到的injectMembers 时。但是您需要访问Injector,它确实适用于遗留案例。我已经用一个例子更新了答案中的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
相关资源
最近更新 更多