ドキュメントでは、 @Provides メソッドには、次のような独自の依存関係がある可能性があると書かれています。
@Provides Pump providePump(Thermosiphon pump) {
return pump;
}
次のように書くと何が変わるでしょうか。
@Provides Pump providePump() {
return new Thermosiphon();
}
そして、最初の抜粋: メソッドはどこからポンプを取得しますか?
ドキュメントには、次のThermosiphon
クラスも示されています。
class Thermosiphon implements Pump {
private final Heater heater;
@Inject
Thermosiphon(Heater heater) {
this.heater = heater;
}
...
}
このクラスのコンストラクターには、注釈が付けられてい@Inject
ます。これにより、Dagger は必要なときにいつでもこのコンストラクターを使用することを認識し、インスタンスをThermosiphon
自動的に提供するHeater
ため、その必要はありません。
自分で新しいThermospihon
インスタンスを作成するのはまったく問題ありませんが、Dagger はこのようにすることで手間を省きます。たとえば、Heater
手動で行う場合、どこかから参照を取得する必要があります。それが Dagger のすべてなので、退屈な反復作業を行う必要はありません。
これらは事実上、インスタンスを要求するたびに Thermosiphon.class の新しいインスタンスが作成される場合と同じです。それがシングルトンの場合 (または何らかの方法でスコープが設定されている場合)、違いがあります。
次の場合、最初の例はシングルトンのエイリアスです。ただし、2 番目の例では、毎回新しいインスタンスが作成されます。
@Provides
@Singleton
Thermosiphon provideThermosiphon() {
return new Thermosiphon();
}
個人的には、最初のアプローチの方が好きです。最初の方法を使用すると、プロバイダーを後で追加または変更し、エイリアスに渡す前にインスタンスのスコープまたは状態を調整できます。少し柔軟になったようです。
モジュールで宣言された他の Bean を探します
例えば:
@Module
public class MainModule {
@Provides
public EmailServiceApiGateway provideEmailServiceApiGateway() {
return new EmailServiceApiGateway();
}
@Provides
public EmailSendingActivityPresenter provideEmailSendingActivityPresenter(EmailServiceApiGateway emailServiceApiGateway) {
return new EmailSendingActivityPresenterImpl(emailServiceApiGateway);
}
}
したがって、上記の場合、EmailServiceApiGateway は EmailSendingActivityPresenter に自動的に挿入されます。