匕首中的依赖关系规定优先级



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

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

@Provides方法总是胜过@Inject构造函数和无参数构造函数(使用字段注入。

这很重要,因为@Provides方法将接管类型创建的责任,其中包括作用域,因此,除非作用域为@Provides方法,否则在 @Provides 方法中手动构造的标记为 @Singleton 的类将不会限定作用域

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

  1. @Module(覆盖=true)@Provides方法
  2. @Module(覆盖=假)(默认)@Provides方法
  3. @Inject构造函数的实时绑定
  4. 无参数构造函数的实时绑定,IF 类具有@Inject字段。

最新更新