所以我有一个模块,它将接口与实现类绑定在一起.
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不重复自己.
| 归档时间: |
|
| 查看次数: |
1651 次 |
| 最近记录: |