とそこで生成されるコンテナの基本概念について説明します。使用できるようにする方法も紹介します。ファイルに追加します。ファイルに次の依存関係を追加します。機能を使用しています。ファイルに次の内容を追加します。クラスが含まれている必要があります。コード生成をトリガーします。レベルの依存関係コンテナとして機能するアプリケーションの基本クラスも含まれます。オブジェクトのライフサイクルにアタッチされ、依存関係を提供します。アプリの親コンポーネントであることから、他のコンポーネントがこのコンポーネントの提供する依存関係にアクセスできます。クラスに依存関係を提供できるようになります。クラスをサポートしています。クラスにもアノテーションを付ける必要があります。フラグメントにアノテーションを付ける場合は、そのフラグメントを使用するアクティビティにもアノテーションを付ける必要があります。サポートには、次の例外があります。拡張するフラグメントのみをサポートします。保存されたフラグメントをサポートしていません。コンポーネントを生成します。これらのコンポーネントは、コンポーネント階層で説明されているように、それぞれの親クラスから依存関係を受け取ることができます。インジェクションを行います。よって注入されたフィールドを非公開にすることはできません。注入するクラスには、インジェクションを使用する他の基本クラスを含めることができます。アノテーションは不要です。コールバックの詳細については、コンポーネントのライフタイムをご覧ください。把握している必要があります。バインディングには、型のインスタンスを依存関係として提供するために必要な情報が含まれています。インジェクションがあります。...}クラスのアノテーションが付けられたコンストラクタのパラメータは、そのクラスの依存関係です。インスタンスの提供方法も把握している必要があります。コンポーネントを生成します。コードを解析して、次の処理を行います。依存関係グラフを作成して検証し、満たされない依存関係や依存関係の循環がないことを確認します。実際のオブジェクトとその依存関係を作成するために実行時に使用するクラスを生成します。インジェクションができないことがあります。これにはいくつかの理由が考えられます。インジェクションができません。インジェクションができません。バインディング情報を提供します。アノテーションが付けられたクラスです。クラスを知らせる必要があります。モジュールとは異なります。クラスに関連付けられている、すべての生成されたコンポーネントで使用できます。モジュールの推移的依存関係に含める必要があります。例を考えてみましょう。インジェクションができません。アノテーションを付けた抽象関数を作成して、バインディング情報を提供します。アノテーションは、インターフェースのインスタンスを提供する必要がある場合に、どの実装を使用するかを知らせるものです。関数の戻り値の型で、その関数が提供するインターフェースのインスタンスを知らせます。関数のパラメータで、提供する実装を知らせます。いうアノテーションが付いています。内のすべての依存関係が、アプリのすべてのアクティビティ内で使用できることを意味します。インジェクションができないのはインターフェースだけではありません。パターンでインスタンスを作成する必要がある場合も同様です。前の例で考えてみましょう。アノテーションを付けることにより、この型のインスタンスを提供できます。関数の戻り値の型で、その関数が提供する型のインスタンスを知らせます。関数のパラメータは、対応する型の依存関係を知らせます。関数の本体は、対応する型のインスタンスの提供方法を知らせます。その型のインスタンスを提供する必要があるたびに関数の本体を実行します。複数のバインディングを用意する必要があります。修飾子を使用することで、同じ型に対して複数のバインディングを定義できます。つの型に複数のバインディングが定義されている場合に、そのタイプの特定のバインディングを識別するために使用するアノテーションです。具体的な例で考えてみましょう。オブジェクトを使用できます。他のサービスには、別の方法で呼び出しをインターセプトする必要があります。知らせる必要があります。メソッドにアノテーションを付けるために使用する修飾子を定義します。各修飾子に対応する型のインスタンスの提供方法を把握する必要があります。モジュールを使用できます。つのメソッドでは戻り値の型が同じですが、修飾子によって異なるバインディングとしてラベル付けされます。}}対応する修飾子でフィールドまたはパラメータをアノテーションすることにより、必要とする特定の型を注入できます。プラクティスとして、型に修飾子を追加する場合は、その依存関係を提供するすべての方法に対して修飾子を追加することをおすすめします。誤った依存関係を注入するかもしれません。いくつかの修飾子が事前定義されています。修飾子が用意されています。クラスでアクティビティのコンテキストが必要であるとします。アクティビティのコンテキストの提供方法を示しています。利用できる他の事前定義済みバインディングについては、コンポーネントのデフォルトのバインディングをご覧ください。コンポーネントがあります。クラスにバインディングを注入する必要があります。使用方法を示しました。次のコンポーネントが用意されています。レシーバにはコンポーネントが生成されません。クラスのインスタンスを自動的に作成、破棄します。構成変更の後も維持されます。すべてのバインディングはスコープ設定されていません。アプリがバインディングをリクエストするたびに、必要な型の新しいインスタンスが作成されます。新しいインスタンスが提供されます。バインディングを特定のコンポーネントにスコープ設定することもできます。回だけスコープ設定されたバインディングを作成します。そのバインディングに対するすべてのリクエストで同じインスタンスを共有します。アノテーションを示します。同じインスタンスが提供されます。コンポーネントに対するバインディングのスコープ設定を行うと、コンポーネントが破棄されるまで提供されたオブジェクトがメモリ内に残るため、処理コストがかかる場合があります。スコープ設定されたバインディングのアプリでの使用は最小限に抑えてください。バインディングでコンポーネントにスコープを設定するのが適しているのは、バインディングの内部状態において特定のスコープ内で同じインスタンスを使用する必要がある場合、バインディングを同期する必要がある場合、またはバインディングの作成にコストがかかる場合です。中だけでなくアプリ内のどの場所でも同じインスタンスを使用する必要があるとします。スコープ設定するのが適切です。インスタンスの提供が必要となるたびに、毎回同じインスタンスを提供するようになります。モジュール内のコンポーネントにバインディングをスコープ設定する方法を示しています。インストールする必要があります。スコープ設定をご覧ください。セクションをご覧ください。コンポーネント階層モジュールをコンポーネントにインストールすると、コンポーネント内の他のバインディングの依存関係として、そのバインディングにアクセスできます。コンポーネント階層内で下位にある子コンポーネント内の他のバインディングの依存関係としてもアクセスできます。定義されたバインディングを使用できます。アノテーションを使用します。バインディングのセットが用意されています。このバインディングは、特定のサブクラスではなく、一般のアクティビティ型とフラグメント型に対応しています。コンポーネント定義を使用して、すべてのアクティビティを注入するためです。アクティビティごとに、このコンポーネントの異なるインスタンスがあります。