dagger2 中的@Provide 和@Inject 有啥区别?

Posted

技术标签:

【中文标题】dagger2 中的@Provide 和@Inject 有啥区别?【英文标题】:whats the difference between @Provide and @Inject in dagger2?dagger2 中的@Provide 和@Inject 有什么区别? 【发布时间】:2021-10-17 19:02:05 【问题描述】:

@Inject 和@Provide 有什么区别?

虽然两者都是用来提供依赖的,但是有什么区别呢?

【问题讨论】:

【参考方案1】:

documentation、@Inject@Provides 很好地涵盖了这一点,它们是在依赖关系图中引入依赖关系的两种不同方式。它们适用于不同的用例

@Inject

    简单易用,只需在构造函数或属性上添加@Inject即可完成 它可用于注入类型以及类型属性 在某些人看来,从主观上看,它可能比 @Provides 更清晰

@Provides

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

以下是@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

在依赖图中注入接口类型

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

【讨论】:

【参考方案2】:

@Inject:- 用于在类中注入依赖项。 @provides:- 需要在创建实际实例的地方使用 @provide 注释方法。

【讨论】:

以上是关于dagger2 中的@Provide 和@Inject 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

详解vue中的provide/inject

vue3中provide和inject的使用

Dagger2 探索记3——两大进阶组件

Dagger2 和依赖组件中的限定符

Vue中 provideinject 详解及使用

应该将演示者(mvP)注入(dagger2)到android中的视图吗?