我有一个简单的层次结构,如下所示:
public abstract class AbsFoo {
protected AbsBoo boo;
}
public class Foo extends AbsFoo {
public Foo() {
boo = new Boo(); // Boo extends AbsBoo
}
}
编辑: AbsFoo 的实例应该即时创建,并且可能不是字段
可以boo = new Boo()
用注射代替吗?
我有一个简单的层次结构,如下所示:
public abstract class AbsFoo {
protected AbsBoo boo;
}
public class Foo extends AbsFoo {
public Foo() {
boo = new Boo(); // Boo extends AbsBoo
}
}
编辑: AbsFoo 的实例应该即时创建,并且可能不是字段
可以boo = new Boo()
用注射代替吗?
是的:
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();
}
只要 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);
...
}