5

@Inject アノテーション付きコンストラクターを使用して Dagger に依存関係を提供する方法を通知する場合、後でモジュールでそれをオーバーライドできますか? ケース: プロダクション コードでアノテーション付きコンストラクターを持つコンポーネントを使用しており、テスト中にテスト実装でそれをオーバーライドしたいと考えています。私の override = true モジュールは、テスト中に本番環境の実装を正常にオーバーライドできますか?

または、より一般的な質問として、モジュールと注釈付きクラスのどちらが優先されますか? </p>

4

1 に答える 1

9

@Provides メソッドは、常に @Inject コンストラクターと引数なしのコンストラクター (フィールド インジェクションを使用) よりも優先されます。

@Provides メソッドは型の作成の責任を引き継いでおり、これにはスコープが含まれているため、これは重要です。そのため、@Provides メソッドがスコープ化されていない限り、@Provides メソッドで手動で構築された @Singleton とマークされたクラスはスコープ化されません。 .

テストのコンテキストで「オーバーライド」という言葉を使用していることに注意してください...この場合、 @Module(override=true) 設定を使用する必要はありません(害はありませんが)。これは単なる優先順位であり、(実際には) 次のように解決されます。

  1. @Module(overrides=true) @Provides メソッド
  2. @Module(overrides=false) (デフォルト) @Provides メソッド
  3. @Inject コンストラクターの Just In Time バインディング
  4. 引数のないコンストラクターの Just In Time バインディング、IF クラスには @Inject フィールドがあります。
于 2013-12-18T01:18:14.977 に答える