Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么匕首会注入具体的类?_Java_Android_Dependency Injection_Dagger - Fatal编程技术网

Java 为什么匕首会注入具体的类?

Java 为什么匕首会注入具体的类?,java,android,dependency-injection,dagger,Java,Android,Dependency Injection,Dagger,我是新来的Dagger,我以前用过Guice 我读过这个 我很困惑: 1) 我为什么要用匕首来注射混凝土构件? 在所有DI点之后,隐藏接口下的可替换实现。没有 我的意思是,我可以使用Guice将其注入到具体的成员中,但我只会在我想要注入全局单例时这样做 2) 我有时会看到带有Inject注释的模块类。 为什么需要这样的声明?编译器可以通过@Provides注释从返回的方法类型引用它。没有 如果需要的话,为什么有时候会丢失呢?如示例中所示: @Module class DripCoffeeModu

我是新来的
Dagger
,我以前用过
Guice

我读过这个

我很困惑:

1) 我为什么要用匕首来注射混凝土构件? 在所有DI点之后,隐藏接口下的可替换实现。没有

我的意思是,我可以使用Guice将其注入到具体的成员中,但我只会在我想要注入全局单例时这样做

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

如果需要的话,为什么有时候会丢失呢?如示例中所示:

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

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

我不明白你第一个问题的意思。如果您指的是依赖项由DI反转,那么它不同于依赖项注入。注入仅仅是从类中获取关注点,并从类中提供所有需求

对于第二个问题,您需要@injectannotation来表示您只需要从dagger中填充这个变量。也许您还有三个相同类型的变量,您需要自己填充它们。假设字符串类型,您的类中可能有一堆字符串变量,但您不希望所有变量都由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对象的实例才能执行此操作。因此,它找到了一个可以提供热虹吸的方法(provideThermosiphonPump),然后运行该方法,获取热虹吸对象并将其提供给providePump方法,然后为您提供Pump对象