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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章