因此,我有一个将接口与实现类绑定的模块。

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

此绑定还将注入以下构造函数:
@Inject
public LocalStoreUser(LocalStore localstore) {
    this.localstore = localstore
}

最佳答案

注入将起作用,但不是由于绑定。

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

但是,如果LocalStore具有公共的无参数构造函数(或已列出的带有@Inject注释的构造函数),那么Guice可以直接创建类型,因此上面的代码将起作用-它与自动绑定子类无关。

考虑以下示例:

interface A {}
interface B extends A {}
public class C implements B {}
  • 完全没有任何绑定,您可以注入C,因为它具有隐式的公共无参数构造函数。如果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而无需重复自己。
  • 关于guice - Guice绑定(bind)也绑定(bind)子类吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31598703/

    10-17 00:53