gpt4 book ai didi

java - 为什么 Dagger 注入(inject)具体类?

转载 作者:行者123 更新时间:2023-12-05 07:52:08 24 4
gpt4 key购买 nike

我是 Dagger 的新手,我之前使用过 Guice

我读过这个tutorial

我很困惑:

1) 为什么我什至要用 Dagger 注入(inject)混凝土构件?毕竟 DI 的要点是在接口(interface)下隐藏可替换的实现。没有?

我的意思是我可以使用 Guice 注入(inject)具体成员,但我只会在我想注入(inject)全局单例时这样做。

2) 我有时会看到带有 Inject 注释的 Module 类。为什么需要该声明?编译器可以使用 @Provides 注释从方法的返回类型中引用它。没有?

如果需要,为什么有时会丢失?就像在示例中一样:

@Module
class DripCoffeeModule {
@Provides Heater provideHeater() {
return new ElectricHeater();
}

@Provides Pump providePump(Thermosiphon pump) {
return pump;
}
}

最佳答案

我不明白你第一个问题的意思。如果您通过 DI 表示依赖性反转,则它与依赖性注入(inject)不同。注入(inject)只是将关注点从类中移出并提供它们的所有需求。

对于你的第二个问题,你需要@inject 注释来说明你只需要从 Dagger 中填充这个变量。也许您还有其他三个相同类型的变量,您需要自己填充它们。假设字符串类型,您的类中可能有一堆字符串变量,但您不希望所有这些变量都由 dagger 提供的内容填充,因此您只需提及 @inject 告诉 dagger 为您填充变量。

为了解释您的示例,我必须说您不需要在模块中使用@inject 注释注入(inject)变量。因为这里是提供一切的地方 Dagger 已经知道他必须提供所有方法参数变量。

当你在模块中编写一个方法时,你正在提供一些东西,Dagger 会为你寻找所有的方法参数变量,并使用你为此提供的其他方法来填充它们。让我举个例子给你看:

@Module
class DripCoffeeModule
{
@Provides Heater provideHeater()
{
return new ElectricHeater();
}

@Provides Pump providePump(Thermosiphon tPump)
{
return tPump;
}

@Provides Thermosiphon provideThermosiphonPump()
{
return new Thermosiphon();
}
}

在上面的代码中,Dagger 将使用您之前提供的方法 providePump() 提供 tPump。所以你不需要通知 Dagger 在你的模块中使用注入(inject)。不言而喻。

每当您注入(inject)一个 Pump 类型的变量时,Dagger 首先会在您的模块中找到一个返回类型为 Pump (providePump) 的方法,然后它会识别它需要创建一个 Thermosiphon 对象的实例来执行此操作。所以它会找到一个可以提供 Thermosiphon 的方法 (provideThermosiphonPump),然后运行它并获取 Thermosiphon 对象并将其提供给 providePump 方法,然后为您提供 Pump 对象。

关于java - 为什么 Dagger 注入(inject)具体类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34089414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com