injection]フレームワークです。ドメイン固有のライフサイクルコンテキストを介してステートフルコンポーネントのライフサイクルを管理し、タイプセーフな方法でクライアントオブジェクトにコンポーネント(サービス)を注入することができます。このチュートリアルでは、CDIの最も関連する機能を詳しく調べ、クライアントクラスに依存関係を注入するためのさまざまなアプローチを実装します。DYDI(日曜大工依存インジェクション)一言で言えば、フレームワークに頼らずにDIを実装することは可能です。このアプローチは、DYDI(DIY依存性注入)として広く知られています。DYDIでは、必要な依存関係を単純な古いファクトリ/ビルダーを介してクライアントクラスに渡すことによって、アプリケーションコードをオブジェクトの作成から分離しています。基本的なDYDI実装は次のようになります。}}もちろん、DYDIは比較的単純なユースケースに適しています。サンプルアプリケーションのサイズと複雑さが増し、相互接続されたオブジェクトのより大きなネットワークを実装すると、大量のオブジェクトグラフファクトリで汚染されることになります。これはオブジェクトグラフを作成するためだけに多くの定型コードを必要とします。これは完全にスケーラブルなソリューションではありません。DIをもっと良くできますか?もちろん、我々はできます。これがまさにCDIが登場する場所です。3簡単な例CDIはDIを非常に簡単なプロセスに変え、いくつかの単純なアノテーションでサービスクラスを装飾し、クライアントクラスで対応する注入ポイントを定義することになりました。CDIが最も基本的なレベルでDIを実装する方法を示すために、簡単な画像ファイル編集アプリケーションを開発したいとしましょう。開く、編集、書き込み、画像ファイルの保存などができます。"src/main/resources/META-INF/"フォルダーに配置する必要があります。サービスクラス次に、GIF、JPG、およびPNGファイルで上記のファイル操作を実行するサービスクラスを作成しましょう。アノテーションを使用してインジェクションポイントを定義しましょう。アノテーションはCDIの実際の主力です。これにより、クライアントクラスで注入ポイントを定義できます。実装をコンストラクターに挿入するように指示します。アノテーション(フィールドインジェクション)とセッター(セッターインジェクション)を使用してサービスをインジェクトすることもできます。これらのオプションについては後で説明します。クラスコンストラクターに挿入するようにする必要があります。するには、まず、クラスのインスタンスを取得する必要があります。SEでのCDI参照実装であるhttp://weld.cdi-spec.org/[Weld]で行います。メソッドを呼び出します。予想通り、アプリケーションを実行すると、CDIは__DeploymentExceptionをスローして大声で不平を言います。実装をインジェクトするのかわからないため、この例外が発生しています。**CDIの用語では、これはあいまいな挿入例外として知られています。注釈このあいまいさを解決するのは簡単です。アノテーションでインターフェースのすべての実装にアノテーションを付けます。したがって、どの実装をクライアントクラスにインジェクトするかを明示的に指示する必要があります。アノテーションが付けられている)がインジェクトする実装であることがわかりました。アプリケーションを再実行すると、今回は期待どおりに実行されます。アノテーションを付けて他の実装を代替手段として使用しても、上記と同じ結果になります。アノテーションを単純に切り替えることによって、実装のランタイムインジェクションを非常に簡単に交換できる方法を示しています。4フィールドインジェクションCDIは箱から出してフィールドとセッターの両方の注入をサポートします。同様に、セッターインジェクションを行う方法は次のとおりです。アノテーションを使用してサービスをインジェクトする方法を学びました。アノテーションを使用してサービスインジェクションを実行することもできます。このメソッドは意味のある名前を実装に結び付けることによって、サービスを注入するためのより意味のある方法を提供します。クラスのインジェクションポイントを名前付き実装と一致するようにリファクタリングする必要があります。}名前付き実装を使用してフィールドとセッターのインジェクションを実行することもできます。アノテーションを使用するのと非常によく似ています。アノテーション場合によっては、サービスは、追加の依存関係を処理するために注入される前に、いくつかの構成を完全に初期化する必要があります。アノテーションを通じて、これらの状況に対するサポートを提供します。使用すると、完全に初期化されたサービスの作成を担当するファクトリクラスを実装できます。クラスをリファクタリングしましょう。サービスを利用することができます。このサービスは、特定のイメージファイル操作が実行された時刻を記録するために使用されます。アノテーションを付けるだけです。サービスをインジェクトします。実行すると、次のように出力されます。17:468カスタム修飾子CDIは、依存関係を修飾し、あいまいな注入ポイントを解決するためのカスタム修飾子の使用をサポートします。カスタム修飾子は非常に強力な機能です。セマンティック名をサービスにバインドするだけでなく、注入メタデータもバインドします。https://docs.oracle.com/javase/7/docs/api/java/lang/annotation/RetentionPolicyなどのメタデータ。html[RetentionPolicy]および有効な注釈ターゲット(https://docs.oracle.com/javase/7/docs/api/java/lang/annotation/ElementType.html[ElementType])。アプリケーションでカスタム修飾子を使用する方法を見てみましょう。実装にバインドしましょう。}アプリケーションをもう一度実行すると、上記と同じ出力が生成されるはずです。カスタム修飾子は、名前と注釈メタデータを実装にバインドするための適切な意味論的アプローチを提供します。カスタム修飾子を使用すると、より制限の厳しいタイプセーフなインジェクションポイントを定義できます(@Defaultおよび@Alternativeアノテーションの機能よりも優れています)。サブタイプのみが型階層で修飾されている場合、CDIは基本タイプではなくサブタイプのみを挿入します。追加のアノテーションのコストは、組織化された依存性注入を得るための非常に小さな努力です。DYDIがCDIよりもまだその地位を占めている場合があります。単純なオブジェクトグラフしか含まれていないかなり単純なアプリケーションを開発するときのように。いつものように、この記事に示されているすべてのコードサンプルはhttps://github.com/eugenp/tutorials/tree/master/cdi/src/main/java/com/baeldung/dependencyinjection[GitHubで利用可能]です。