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对象