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 而无需重复自己。
所以我有一个模块将接口与实现绑定 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 而无需重复自己。