Dagger中的依赖提供优先权

时间:2013-12-18 01:14:17

标签: dependency-injection dagger

当您使用@Inject-annotated构造函数通知Dagger如何提供依赖项时,您是否可以稍后在模块中覆盖它?案例:我的生产代码使用带有带注释的构造函数的组件,我想在测试期间使用测试实现覆盖它。我的override = true模块会在测试期间成功覆盖生产实现吗?

或者更一般的问题,什么优先,模块或注释类?

1 个答案:

答案 0 :(得分:5)

@Provides方法总是特朗普@Inject构造函数和无参数构造函数(带字段注入。

这很重要,因为@Provides方法接管了创建类型的责任,并且包括作用域,因此在@Provides方法中手动构造的标记为@Singleton的类将除非@Provides方法是作用域的,否则应限定范围。

请注意,您在测试的上下文中使用了“override”一词...在这种情况下,您不需要使用@Module(override = true)设置(尽管没有任何危害)。它只是一个优先顺序,它解析(实际上)如下:

  1. @Module(overrides = true)@Provides methods
  2. @Module(overrides = false)(默认)@Provides methods
  3. @Inject构造函数的Just In Time绑定
  4. Just-Time绑定no-arg构造函数,IF类具有@Inject字段。