所以我有一个模块,它将接口与实现类绑定在一起。
bind(ILocalStore.class).to(LocalStore.class);
此绑定是否也会注入以下构造函数:
@Inject
public LocalStoreUser(LocalStore localstore) {
this.localstore = localstore
}
答案 0 :(得分:8)
注射将起作用,但不是因为绑定。
Guice将查找看作是一个简单的Map<Key, Provider>
查找,其中Key由(绑定注释,参数化类型)对组成。 Guice不会自动向您走类型层次结构,也不会修改查找键(例如,检查非注释或原始类型绑定)。
但是,如果LocalStore有一个公共无参数构造函数(或者你已经列出的@Inject
- 带注释的构造函数),Guice可以直接创建类型,所以上面的代码可以工作 - 它只是与自动绑定子类无关。
考虑以下示例:
interface A {}
interface B extends A {}
public class C implements B {}
根本没有任何绑定,你可以注入C,因为它有一个隐式的公共no-arg构造函数。如果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而无需重复自己。