Работает ли внедрение метода с Guice, если конструктор не введен?

У меня есть класс, где мне нужно ввести переменную, но конструктор не вводится Guice.

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

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

Значение x не вводится. Нужно ли использовать инъекцию в конструкторе для подсказки, чтобы распознать метод инъекции? Нужно ли вызывать этот метод из какого-то другого класса, чтобы это работало? Спасибо заранее

1 ответ

Если вы собираетесь использовать Guice для @InjectFoo тогда 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 с зависимостями, предоставленными клиентом, во время создания, посмотрите на вспомогательное внедрение

Другие вопросы по тегам