2013-02-25 4 views
6

Springでの名前による依存性注入を実行するための別々の注釈が2つあります(javax.annotation.Resourceおよびjavax.inject.Named)。 Bean名に を参照する技術的に可能であったとしても、春の依存性注入、@ Namedまたは@Resourceを使用するには?

あなたが名前で、アノテーション駆動型の注入を表現する場合には、 は主に@Autowiredを使用していない:documentation at Spring@Resource名前で、注射のために使用されるべきであることを示します@Qualifierの値を使用します。代わりに、JSR-250 @Resource注釈を使用してください。具体的には 特定のターゲットコンポーネントを固有の名前で識別し、宣言されたタイプ はマッチングプロセスとは関係ありません。スプリングのみ@Qualifer組み合わせる@Resource代わりに@Autowiredを提唱されているよう

上記ビット混乱です。 later in the documentationまで@Namedの言及はありません。

JSR-250は@Resourceを定義しますが、JSR-330は@Inject@Namedを定義しています。私は彼らがかなり簡単にSpring内で混在してマッチすることができることを知っています。どのJSRを使用するのですか?

GuiceとCDIの移植性がいいと思うので、JSR-330アノテーションを使用するといいでしょう。一方、JSR-330アノテーションを使用している場合は、Spring内のlimitationsという2つの点でドキュメントも指摘しています。

名前による注釈のためのベストプラクティス(存在する場合)は何ですか?

ありがとうございます。

+1

ここで言及した制限は、Springがこれらの注釈をどのように使用するか、そしてSpringが紹介する注釈がどのようにSpringを特別に扱うためにはるかに堅牢であるかを示しています。 –

+0

制限はすべてそのように煩わしいとは思われません。彼らは存在しますが。 Springが追加のCDIアノテーションを採用していれば、これはもっと簡単になるでしょう。 – Saish

答えて

1

@ResourceはSpring 2.5以降では古く、サポートされていますが、Spring 3.0では@Namedサポートが追加されており、どちらも同じ名前の注入目的を達成するために使用できます。

Springを使用する場合、Spring 2.5との下位互換性と、javax.injectがクラスパス上に追加/仮定されるかどうかについての懸念があります。

+0

@Inject @Named( "beanName")は3.0.7の春には動作しませんが、@Resource(name = "beanName")では動作しません。 –

+0

javax.injectまたはjavaee-api jarはクラスパス上にありますか? \ @Injectと\ @NamedのサポートがSpring 3.0.0以降に追加されていることを確認してください。 –