Guice 绑定是否也绑定子类?

Does Guice binding bind subclass as well?

所以我有一个模块将接口与实现绑定 class。

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

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

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

注入会起作用,但不是因为绑定。

Guice 将查找视为简单的 Map<Key, Provider> 查找,其中 Key 由(绑定注释,参数化类型)对组成。 Guice 不会自动为您向上遍历类型层次结构,或以其他方式修改查找键(例如,检查未注释或原始类型绑定)。

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


考虑以下示例:

interface A {}
interface B extends A {}
public class C implements B {}
  • 根本没有任何绑定,您可以注入 C,因为它有一个隐式 public 无参数构造函数。如果 C 有一个带 @Inject 注释的构造函数,这同样适用。请求注入A或B会失败

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

  • superclasses/superinterfaces 也是如此:如果你要 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 而无需重复自己。