Guice - 如何从孩子的父母中注入抽象字段

时间:2012-05-19 18:02:06

标签: dependency-injection abstract-class guice

我有一个简单的层次结构如下:

public abstract class AbsFoo {
    protected AbsBoo boo;
}

public class Foo extends AbsFoo {
    public Foo() {
        boo = new Boo(); // Boo extends AbsBoo
    }
} 

编辑:AbsFoo的实例应该是动态创建的,可能不是字段

我可以用注射替换boo = new Boo()吗?

2 个答案:

答案 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);
    ...
}