web-dev-qa-db-ja.com

javax.inject.Namedアノテーションは何のために使用されることになっていますか?

javax.injectパッケージを理解しようとしていますが、javax.inject.Namedアノテーションの使用目的が明確ではありません。 Javadocは、その背後にある考え方を説明していません。

Javadocは http://download.Oracle.com/javaee/6/api/javax/inject/Named.html にあります

私はSpring 3.0を使用していくつかのサンプルプログラムを記述しています。@NamedをBeanに追加することにより、Beanファクトリに追加するようですが、Javadocの説明はそうですそれが標準の動作なのか、Spring固有の動作なのかわかりません。

私の質問は:

  1. @Named@Qualifierの違いは何ですか
  2. クラスは他のクラスに注入可能であるべきであるとランタイムシステムにどのように通知するのですか? Springの@Componentに相当しますか?

Update 1@Namedおよび@Qualifierに関するニースの記事で@Namedおよび@Qualifierの優れた説明があります http://Java.dzone.com/ articles/Java-ee6-cdi-named-components @xmedekoにリンクしてくれてありがとう。

103
ams

@Namedを使用して、同じスコープ内にバインドされた同じタイプの異なるオブジェクトを区別します。

@Named("maxWaitTime")
public long maxWaitTimeMs;

@Named("minWaitTime")
public long minWaitTimeMs;

@Named修飾子がなければ、インジェクターはどの変数にどの長さをバインドするかを知りません。

@Namedのように動作する注釈を作成する場合は、作成時に@Qualifier注釈を使用します。 @Namedを見ると、それ自体に@Qualifierという注釈が付けられています。

75
sbridges

@Inject Springの@Autowiredの代わりにBeanを注入します。
@Named Springの@Componentの代わりにBeanを宣言します。

これらのJSR-3標準アノテーションは、Springアノテーションと同じ方法でスキャンおよび取得されます(次のjarがクラスパスにある限り)

52
Nadav Finish

#2に関して、JSR-330仕様によると:

このパッケージは、移植可能なクラスを可能にする依存性注入アノテーションを提供しますが、外部依存性設定はインジェクター実装に任せます。

そのため、どのオブジェクトをインジェクションに使用できるかを決定するのはプロバイダー次第です。 Springの場合、それはすべてSpring Beanです。また、JSR-330アノテーションが付けられたクラスは、AnnotationConfigApplicationContextを使用するときに自動的にSpring Beanとして追加されます。

7
sourcedelica

@Namedアノテーションの主な役割は、通常JSF ELリゾルバーを介して、アプリケーション内のELステートメントを解決する目的でBeanを定義することです。インジェクションは名前を使用して実行できますが、CDIはインジェクションポイントとそれらにインジェクトされるBeanを表現するためのはるかに豊富な方法を提供するため、CDIでのインジェクションの動作方法ではありませんでした。

3
abbas