我在appModule中有一个没有作用域的绑定,它和使用Singleton作用域注入的构造函数是同一个类。当我在appComponent中为Foo添加声明时,生成的代码会选择没有任何DoubleCheck
的模块绑定,即未作用域绑定超过构造函数注入的单例绑定,为什么会这样?
@Module
public class AppModule {
@Provides
public Foo provideFoo() {
return new Foo();
}
}
@Component(module = AppModule.class)
@Singleton
public interface AppComponent {
Foo getFoo();
}
@Singleton
class Foo @Inject constructor(){
//..
}
依赖关系的提供有一些层次结构,我还没有找到关于这方面的文档,但我也遇到了同样的事情。如果我在测试中没有记错的话,那么Dagger试图获取依赖项的层次结构如下:
- 绑定实例(通过组件构建器方法;例如@BindsInstance)
- 模块提供
- 构造器注入类
在这个列表的某个地方可能也应该包括预置的依赖项(从你的组件有依赖的父组件预置),但我不知道它在层次结构中的位置。
通常没有必要以多种方式提供相同的依赖,为什么你要同时通过模块和构造函数注入来提供依赖呢?如果存在多个依赖,但是它们位于不同的作用域,请尝试使用不同的作用域,而不是只使用单例作用域。我能想到的一个原因,你想使用这个技工,这当你通常想要某种依赖注入提供了通过构造函数或模块,但专门为一个测试构建,你想覆盖,依赖不同的依赖通过改变组件是如何组成一个测试构建(即改变DaggerComponent所以它需要@BindsInstance覆盖默认的方法依赖于一个测试依赖)。