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

标签 android kotlin dagger-2 dagger

@Inject 和@Provide 有什么区别?

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

最佳答案

这在 documentation 中有很好的介绍。 , @Inject@Provides 是在依赖图中引入依赖的两种不同方式。它们适用于不同的用例

@Inject

  1. 易于使用,只需在构造函数或属性上添加@Inject即可完成
  2. 它可用于注入(inject)类型以及类型属性
  3. 在某些人看来,在主观方面,它似乎比 @Provides 更清晰

@Provides

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

以下是@Provides的以上三点的例子


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

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

@Provides
fun provideString(): String {
    return "Hello World"
}

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

@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
}

在依赖图中注入(inject)接口(interface)类型

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
}

关于android - dagger2 中的@Provide 和@Inject 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68790768/

相关文章:

android - 如何获取手机上所有已安装的应用程序?

android - 如何从jetpack compose中的惰性列中删除项目

java - 使用 Dagger 注入(inject) Activity

android - 摆脱 "Exported service does not require permission"警告

java - Android Java,onfinish();让我参与某项 Activity

java - 如何将整个 View (水平和垂直滚动)保存为图像或pdf?

java - 有没有办法将 jpa 谓词数组传递给 KOTLIN 中的 criteriabuilder?

java.lang.String 在 Android 应用程序中接收数据时引入新字符

java - Dagger 2 : Provide same instance between multiple Component with same Scope on different library modules

android - 带有命名参数的 Kotlin 中的 Dagger 2 构造函数注入(inject)