Guice绑定绑定子类吗?

Yu *_*hen 1 guice

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

bind(ILocalStore.class).to(LocalStore.class);
Run Code Online (Sandbox Code Playgroud)

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

@Inject
public LocalStoreUser(LocalStore localstore) {
    this.localstore = localstore
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*ica 10

注射将起作用,但不是因为结合.

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

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


请考虑以下示例:

interface A {}
interface B extends A {}
public class C implements B {}
Run Code Online (Sandbox Code Playgroud)
  • 没有任何绑定,你可以注入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不重复自己.