我有一个简单的层次结构如下:
public abstract class AbsFoo {
protected AbsBoo boo;
}
public class Foo extends AbsFoo {
public Foo() {
boo = new Boo(); // Boo extends AbsBoo
}
}
编辑:AbsFoo的实例应该是动态创建的,可能不是字段
我可以用注射替换boo = new Boo()
吗?
答案 0 :(得分:5)
是:
public abstract class AbsFoo {
protected AbsBoo boo;
}
public class Foo extends AbsFoo {
@Inject
public Foo(Boo boo) {
super.boo = boo; // Boo extends AbsBoo
}
}
确保使用@Inject或injector.getInstance()
构造Foo实例修改强>
您还可以使用提供程序按需创建实例:
@Inject
Provider<Foo> fooProvider
//...
public void doSomething(){
//need new foo:
Foo foo = fooProvider.get();
}
答案 1 :(得分:2)
只要Boo本身不是抽象的,你就应该能够。
public class Foo extends AbsFoo {
@Inject
public Foo( AbsBoo boo ) {
this.boo = boo;
}
}
public class FooModule extends AbstractModule {
@Override
protected void configure() {
bind(AbsBoo.class).to(Boo.class);
bind(AbsFoo.class).to(Foo.class);
}
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new FooModule());
AbsFoo foo = injector.getInstance(AbsFoo.class);
...
}