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