gpt4 book ai didi

guice - Guice 绑定(bind)是否也绑定(bind)子类?

转载 作者:行者123 更新时间:2023-12-01 09:08:56 24 4
gpt4 key购买 nike

所以我有一个模块将接口(interface)与实现类绑定(bind)。

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

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

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

最佳答案

注入(inject)会起作用,但不是因为绑定(bind)。

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

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


考虑以下示例:

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

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

  • 同样适用于父类(super class)/超接口(interface):如果你要 bind(B.class).to(C.class)您可以注入(inject) B(显式)或 C(隐式),但不能注入(inject) A,即使 B 扩展了 A。

  • 如果你要 bind(A.class).to(B.class) bind(B.class).to(C.class) ,然后您可以注入(inject) A、B 或 C 而无需重复自己。

关于guice - Guice 绑定(bind)是否也绑定(bind)子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31598703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com