为什么Dagger注入具体课程?

时间:2015-12-04 13:24:42

标签: java android dependency-injection dagger

我是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;
  }
}

1 个答案:

答案 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对象。