2011-01-10 8 views
24

私は同じタイプ(BeanType)のいくつかの豆を持っています。 IDで注釈を挿入するにはどうすればよいですか?言う:IDでSpring依存関係を挿入するにはどうすればよいですか?

@Autowired @ID("bean1") 
public void setBean(BeanType bean) { 
} 

しかし、注釈はありません@IDです。

私は@Qualifierしか見つけませんでした。これは、すべての豆にID の修飾子を付ける必要があることを意味します。確かに、もっと簡単な方法がありますか?

答えて

60

最も簡単な解決策はなお@Resource

@Resource(name="bean1") 
public void setBean(BeanType bean) { 
} 

を使用する、@Qualifier@Autowiredで使用するためのIDによって豆を指すために使用、例えばbean1でのIDである

@Autowired @Qualifier("bean1") 
public void setBean(BeanType bean) { 
} 

であります注入すべき豆。

Spring manualを参照してください:

代替試合のために、Bean名は、デフォルトの修飾子の値とみなされます。したがって、ネストされた修飾子の代わりにidが "main"のBeanを定義すると、同じ結果が得られます。しかし、このコンベンションを使用して特定のBeanを名前で参照することはできますが、@Autowiredは基本的にオプションのセマンティック修飾子を使用した型駆動型注入です。つまり、修飾子の値は、Bean名のフォールバックを指定しても、常にタイプの一致のセット内でセマンティクスが狭くなります。それらは一意のBean IDへの参照を意味的に表現しません。

名前で、アノテーション駆動型の注入を表現する場合は、主に@Qualifier値を通じてBean名を参照するのは技術的に可能であったとしても、@Autowiredを使用しないでください。代わりに、JSR-250 @Resourceアノテーションを使用します。これは、特定のターゲットコンポーネントを固有の名前で識別するために意味的に定義されています。宣言されたタイプは、マッチングプロセスとは関係ありません。

私は@Resourceを好んでいます(春に固有のものではありません)。

+0

ええと... @Qualifierが豆を見つけていないので、何か間違ったことがあったはずです。 '@ Resource'は動作します。あなたは '@修飾子'が本当にIDのために働いていることを確認できますか?ドキュメントによると、Beanには ''要素が必要です。 –

+2

@Aaron:各アプローチの振る舞いは、実際には微妙に異なります。 '@ Autowired'で' @ Qualifier'を使うとき、修飾子は '@ Autowired'によって与えられたオプションを絞り込むために使われますが、' @ Resource'は明示的に名前でBeanを選択します。 – skaffman

+0

@Aaron:編集を参照してください – skaffman

関連する問題