dagger2中@Provide和@Inject有什么区别?

Sum*_*mit 5 android kotlin dagger dagger-2

@Inject 和 @Provide 有什么区别?

虽然两者都用于提供依赖项,但有什么区别?

mig*_*WOZ 4

文档对此进行了很好的介绍,@Inject并且@Provides是在依赖关系图中引入依赖关系的两种不同方式。它们适用于不同的用例

@Inject

  1. 易于使用,只需添加@Inject构造函数或属性即可完成
  2. 它可用于注入类型以及类型属性
  3. 从主观角度来看,它可能比@Provides某些人更清楚

@Provides

  1. 如果您无权访问要注入的类型的源代码,则无法使用以下标记来标记其构造函​​数@Inject
  2. 在某些情况下,您可能希望在将对象引入依赖关系图中之前对其进行配置,这不是一个选项@Inject
  3. 有时您想引入一个接口作为依赖项,为此您可以创建一个带注释的方法,@Provides该方法返回接口类型

下面以上述三点为例@Provides


如果您无法访问某种类型的源代码

// You can't mark constructor of String with @Inject but you can use @Provides

@Provides
fun provideString(): String {
    return "Hello World"
}
Run Code Online (Sandbox Code Playgroud)

在依赖图中引入之前配置一个对象

@Provides
fun provideCar(): Car {
    val car = Car()
    // Do some configuration before introducing it in graph, you can't do this with @Inject
    car.setMaxSpeed(100)
    car.fillFuel()
    return car
}
Run Code Online (Sandbox Code Playgroud)

在依赖图中注入接口类型

interface Logger { fun log() }
class DiscLogger : Logger{ override fun log() { } }
class MemoryLogger : Logger { override fun log() { } }

@Provides
fun provideLogger(): Logger {
    val logger = DiscLogger() \\ or MemoryLogger()
    return logger
}
Run Code Online (Sandbox Code Playgroud)