我是Dagger
的新用户,之前我使用过Guice
。
我已阅读此tutorial
我很困惑:
1)为什么我甚至会用匕首注入混凝土构件? 在DI的所有要点之后隐藏了接口下的可替换实现。没有?
我的意思是我可以使用Guice注入具体成员,但我只想在注入全局单例时才这样做。
2)我有时会看到带有Inject
注释的Module类。
为什么需要这个声明?编译器可以使用@Provides批注从返回的方法类型中引用它。否?
如果需要,为什么有时会丢失?比如示例:
@Module
class DripCoffeeModule {
@Provides Heater provideHeater() {
return new ElectricHeater();
}
@Provides Pump providePump(Thermosiphon pump) {
return pump;
}
}
答案 0 :(得分:0)
我无法理解你的第一个问题。如果您的意思是DI的依赖性INVERSION,它与依赖INJECTION不同。注入只是让关注从课堂中解脱出来并提供所有需要。
对于你的第二个问题,你需要@inject注释来说你只需要从匕首中填充这个变量。也许你有另外三个相同的类型变量,你需要自己填写它们。假设字符串类型,你的类中可能有一堆字符串变量,但你不希望所有这些变量都被dagger提供,所以你只需要提及@inject告诉dagger为你填充变量。
并解释一下你的例子我必须说你不需要在模块中用@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在你的模块中使用注射。不言而喻。
每当您注入Pump类型的变量时,Dagger首先在模块中找到返回类型为Pump(providePump)的方法,然后它会识别它需要创建一个Thermosiphon对象的实例来执行此操作。所以它找到一个方法可以提供一个Thermosiphon(provideThermosiphonPump),然后运行它并获取Thermosiphon对象并将其提供给providePump方法,然后为你提供Pump对象。