私は Guice の経験からしか話せませんが、これが私の見解です。要するに、注釈ベースの構成は、アプリケーションを結び付けるために書かなければならない量を大幅に削減し、何に依存するかを変更するのを容易にします... 多くの場合、構成ファイル自体に触れる必要さえありません。これは、比較的まれな特定のケースを処理するのを少し難しくすることを犠牲にして、最も一般的なケースを完全に自明にすることによって実現します。
クラスに「インジェクションについての知識がない」ことについて独断的になりすぎるのは問題だと思います。クラスのコードでは、インジェクション コンテナへの参照があってはなりません。私はそれに完全に同意します。ただし、1 つの点を明確にしておく必要があります。注釈はコードではありません。それ自体では、クラスの動作については何も変わりません...注釈がまったくないかのように、注釈を使用してクラスのインスタンスを作成できます。したがって、DI コンテナーの使用を完全に停止して、そこに注釈を残すことができ、何の問題もありません。
クラス内でのインジェクションに関するメタデータのヒント (つまり、アノテーション) を提供しないことを選択すると、そのクラスが必要とする依存関係に関する貴重な情報源を捨てることになります。その情報を他の場所 (XML など) で繰り返すか、予期しない問題につながる可能性のある自動配線などの信頼できない魔法に頼らざるを得ません。
特定の質問に対処するには:
XMLを取り除くのに役立ちます
XML 構成には多くの欠点があります。
- それはひどく冗長です。
- 特別なツールがなければ型安全ではありません。
- 文字列識別子の使用が義務付けられています。繰り返しますが、特別なツールのサポートなしでは安全ではありません。
- 言語の機能をまったく利用せず、コード内の単純なメソッドで実行できることを実行するには、あらゆる種類の醜い構造が必要です。
そうは言っても、多くの人が XML を十分に長く使用してきたので、XML は問題ないと確信しており、その考えが変わるとは思っていません。
多くの場合、各インターフェースには 1 つの実装しかありません
多くの場合、アプリケーションの 1 つの構成(プロダクションなど) に対して、各インターフェースの実装は 1 つだけです。要点は、アプリケーションを起動するときに、通常はインターフェイスを 1 つの実装にバインドするだけでよいということです。その後、他の多くのコンポーネントで使用できます。XML 構成では、そのインターフェースを使用するすべてのコンポーネントに、そのインターフェース (または必要に応じて「Bean」) の特定の 1 つのバインディングを使用するように指示する必要があります。アノテーションベースの構成では、バインディングを一度宣言するだけですそれ以外はすべて自動的に処理されます。これは非常に重要であり、記述しなければならない構成の量が劇的に減少します。また、コンポーネントに新しい依存関係を追加するときに、多くの場合、構成について何も変更する必要がないことも意味します!
いくつかのインターフェースのモック実装があることは関係ありません。単体テストでは、通常、モックを作成して自分で渡すだけです...構成とは関係ありません。代わりにモックを使用して特定のインターフェースを備えた統合テスト用の完全なシステムをセットアップしても、何も変わりません。システムの統合テストの実行では、まだ 1 つの実装しか使用していないため、それを構成する必要があるのは 1 回だけです。
XML: どこにでも何でも注入できます
これは Guice で簡単に行うことができ、CDI でもできると思います。したがって、注釈ベースの構成システムを使用してこれを行うことを完全に妨げられているわけではありません。とは言っても、大部分のアプリケーションに注入されたクラスの大部分は、@Inject
まだ存在しない場合に自分自身に追加できるクラスであるとあえて言いたいと思います。@Inject
アノテーション用の軽量標準 Java ライブラリー (JSR-330) の存在により、今後、より多くのライブラリーやフレームワークがアノテーション付きコンストラクターをコンポーネントに提供することがさらに容易になります。
インターフェースの複数の実装
修飾子はこれに対する 1 つの解決策であり、ほとんどの場合は問題ありません。ただし、場合によっては、特定の注入されたクラスのパラメーターで修飾子を使用してもうまくいかない何かをしたいことがあります...多くの場合、そのクラスの複数のインスタンスが必要で、それぞれが異なるインターフェイス実装またはインスタンスを使用するためです。Guice はPrivateModule
s と呼ばれるものでこれを解決します。この点に関してCDIが何を提供しているかはわかりません。しかし、繰り返しになりますが、これは少数派のケースであり、処理できる限り、構成の残りの部分を犠牲にする価値はありません。