匕首2注入构造函数的参数

我在Dagger 2网站上看到了下面的例子:

class Thermosiphon implements Pump { private final Heater heater; @Inject Thermosiphon(Heater heater) { this.heater = heater; } ... } 

和文件:

当一个新的实例被请求时,Dagger将获得所需的参数值并调用这个构造函数。

当我写一个模块来提供一个Thermosiphon

 @Module public class ThermosiphonModule { @Provides @Singleton Thermosiphon provideThermosiphon() { return new Thermosiphon(???); } } 

Thermosiphon构造函数仍然需要一个Heater作为参数,呈现整个“自动注入构造函数依赖”无用。

我试过了

 return new Thermosiphon(null); 

 return new Thermosiphon(); 

(空的构造函数),并希望Dagger2拿起我想要注入失踪的Heater ,但提供的Thermosiphon的加热器始终为空;

我validation,虽然我的HeaterComponent / HeaterModule工作正常,并能够提供一个Heater

我完全误解了“匕首满足你的构造函数依赖”的整个特性吗?还是我错过了一些东西?

如果您使用的是模块,那么如果您将两个提供程序模块绑定到相同的组件,则可以让他们将加热器视为构造函数参数。

 @Module public class HeaterModule { @Provides @Singleton Heater heater() { return new Heater(); // if not using @Inject constructor } } @Module public class ThermosiphonModule { @Provides @Singleton Thermosiphon thermosiphon(Heater heater) { return new Thermosiphon(heater); // if not using @Inject constructor } } @Singleton @Component(modules={ThermosiphonModule.class, HeaterModule.class}) public interface SingletonComponent { Thermosiphon thermosiphon(); Heater heater(); void inject(Something something); } public class CustomApplication extends Application { private SingletonComponent singletonComponent; @Override public void onCreate() { super.onCreate(); this.singletonComponent = DaggerSingletonComponent.builder().build(); //.create(); } public SingletonComponent getSingletonComponent() { return singletonComponent; } } 

但是使用构造函数注入,只要他们有一个@Inject构造函数,你也可以提供给定范围的对象,或者无范围的对象。

例如,

 @Singleton @Component // no modules public interface SingletonComponent { Thermosiphon thermosiphon(); Heater heater(); void inject(Something something); } 

 @Singleton public class Heater { @Inject public Heater() { } } 

 @Singleton public class Thermosiphon { private Heater heater; @Inject public Thermosiphon(Heater heater) { this.heater = heater; } } 

要么

 @Singleton public class Thermosiphon { @Inject Heater heater; @Inject public Thermosiphon() { } } 

首先,因为你用@Inject注解了Thermosiphon的构造函数, Thermosiphon你不需要@Provides方法。 Dagger使用这个构造函数在需要的时候创build一个实例。 只需用Thermosiphon注释Thermosiphon类本身来保持单例行为。

如果您确实想要使用@Provides方法,并且完全回答您的问题,则可以将Heater指定为方法的参数:

 @Module public class ThermosiphonModule { @Provides @Singleton Thermosiphon provideThermosiphon(Heater heater) { return new Thermosiphon(heater); } }