Guice绑定是否也绑定了子类?

时间:2015-07-23 21:52:26

标签: guice

所以我有一个模块,它将接口与实现类绑定在一起。

bind(ILocalStore.class).to(LocalStore.class);

此绑定是否也会注入以下构造函数:

@Inject
public LocalStoreUser(LocalStore localstore) {
    this.localstore = localstore
}

1 个答案:

答案 0 :(得分:8)

注射将起作用,但不是因为绑定。

Guice将查找看作是一个简单的Map<Key, Provider>查找,其中Key由(绑定注释,参数化类型)对组成。 Guice不会自动向您走类型层次结构,也不会修改查找键(例如,检查非注释或原始类型绑定)。

但是,如果LocalStore有一个公共无参数构造函数(或者你已经列出的@Inject - 带注释的构造函数),Guice可以直接创建类型,所以上面的代码可以工作 - 它只是与自动绑定子类无关。

考虑以下示例:

interface A {}
interface B extends A {}
public class C implements B {}
  • 根本没有任何绑定,你可以注入C,因为它有一个隐式的公共no-arg构造函数。如果C具有@Inject - 带注释的构造函数,则同样适用。请求注入A或B将失败。

  • 如果你要bind(A.class).to(C.class),你可以注入A(显式)或C(隐式)而不是B. Guice也不会绑定子接口,所以B没有实现。< /强>

  • 同样适用于超类/超级接口:如果你是bind(B.class).to(C.class),你可以注入B(显式)或C(隐式)而不是A,即使B扩展A。

  • 如果您要bind(A.class).to(B.class) bind(B.class).to(C.class),那么您可以注意A,B或C而无需重复自己。