最初に、この投稿は CDI を批判することを意図したものではなく、CDI の設計の背後にある考え方と仮定を発見し、CDI を使用する Web アプリの設計に明らかな影響を与えることを明確にする必要があります。
(Java EE 6 の) CDI の最も優れた機能の 1 つは、タイプ セーフです。Jboss Seam はタイプが安全ではありませんでした。名前を使用して、注入するインスタンスを修飾します。以下のように:
@Name("myBean")
public class MyBean implements Bean {
...
}
@Name("yourBean")
public class YourBean implements Bean {
...
}
MyBean を注入するときに、次のことができます。
@In
private Bean myBean; //myBean is injected
@In
private Bean yourBean; //yourBean is injected
Spring の以前のバージョン (3.0 より前) では、このタイプのインジェクションは次のように発生しました。
Bean 構成ファイルで Bean を定義するだけです。
<bean id="myBean" class="com.example.common.MyBean">
...
</bean>
<bean id="yourBean" class="com.example.common.YourBean">
...
</bean>
そして、名前付き修飾子を使用して、使用するものを決定します。
@Autowired
@Qualifier("myBean")
private Bean bean;
@Autowired
@Qualifier("yourBean")
private Bean bean;
Qualifier
しかし、現在の CDI では、まず、特定のタイプのオブジェクトに対してカスタム アノテーションを定義する必要があります。次に、そのアノテーションを使用してそのオブジェクトを修飾します。一日の終わりにソース コードを見ると、依存性注入のために多くのカスタム アノテーションを記述するのにかなりの時間を浪費していることがわかります。Java コミュニティは、XML ベースの構成 (詳細な XML )を後にして、注釈に移行しています。これ (カスタム アノテーションを使用した型の安全性) を冗長なアノテーションとしてではなく、CDI の優れた優れた機能として考えるように説得するものはありますか?
編集:
ポイントを押してハイライト表示
- サービスごとまたは dao (インターフェースごと) ごとに型安全性のためにカスタム修飾子を使用すると、複数の実装を持つ 1000 以上のサービスまたは dao クラスを持つような大規模なアプリケーションの場合、面倒になります。次に、大規模なアプリケーションの場合、タイプセーフインジェクションを使用することは可能ですか?
- 上記の質問の答えが「いいえ」の場合、タイプ セーフを使用するポイントは何ですか?
- 大規模なアプリケーションでタイプ セーフのための注釈を記述することが可能であるとしても、冗長な xml構成を回避するだけの努力をするだけの価値があるのでしょうか?
- Bean 名修飾子の代わりに型安全性が実際に必要になるのはいつですか?
上記の点に関する短い議論
- タイプ セーフ インジェクションが実際に必要になるケースはあまり多くありません。特に、インターフェイスの実装が 1 つしかない場合は
@Name
、修飾子として使用する必要があります。そうです、大規模なアプリケーションでは、実際に必要なときにタイプ セーフを使用することは現実的です。 - もちろん、タイプ セーフは CDI の優れた機能の 1 つであり、受け入れられた回答には、タイプ セーフを使用することを選択した理由の網羅的でないリストがあります。
- あなたは頭の良いプログラマーであり、型安全性をいつ使用すべきかを正確に知っているので、本当に必要なときに努力する価値は間違いなくあります。
- 受け入れられた回答のほとんどの部分は、型の安全性がいつ必要になるかを実際に語っています。この記事も理解するのに非常に役立ちます。
ありがとう、ハッピーコーディング!