web-dev-qa-db-ja.com

@Qualifierアノテーションを使用した@Primaryと@Autowiredの違い

したがって、私が正しく理解していれば、両方が複数の候補がある場合にどちらのBeanを自動配線するかを決定する方法です。それで、違いは正確に何ですか?

15
Maciaz

「デフォルト」として @Primary を読み取ります。

Beanに@Autowiredwithoutany @Qualifierがあり、タイプのBeanが複数存在する場合、候補Beanには@Primaryが選択されます。つまり、他の情報が利用できない場合、つまり@Qualifierがない場合のデフォルトの選択です。

良いユースケースは、最初はタイプのBeanが1つしかなかったため、コードで@Qualifierが使用されなかったことです。次に、別のBeanを追加するときに、古いBeanと新しいBeanの両方に@Qualifierを追加するため、@Autowiredで必要なものを選択できます。古い元のBeanに@Primaryも追加することにより、既存のすべての@Qualifier@Autowiredを追加する必要がなくなります。いわゆる「祖父」です。

@Primaryは、たとえば@Autowiredの95%は特定のBeanを望んでいます。そうすれば、他のBeanを必要とする@Autowiredのみが@Qualifierを指定する必要があります。このように、すべての自動配線が必要とするプライマリBeanがあり、@Qualifierは「代替」Beanを要求するためにのみ使用されます。

26
Andreas

@Qualifierは常に@Autowiredと組み合わせて使用​​する必要があります。これは、同じタイプの複数のBeanがアプリケーションコンテキストに存在する場合に自動配線する必要があるBean名を示します(したがって、スプリングは名前で自動配線できます)。

@Primaryは、@Bean/@Autowiredと組み合わせて使用​​する必要があります。これは、同じタイプのBeanが複数存在する場合に、より高い優先度を与える必要があるBeanを示します。

@Primaryを使用する古典的な使用例の1つは、フレームワーク(スプリングデータの例)が何らかのタイプのBean(EntityManagerの例)を予期しているが、複数のデータソースがあり、複数のEntity Managerを構成した場合です。そのような場合、@Qualifierはまったく役に立ちません。

6
pvpkiran

@ Qualifier

インジェクションポイントで使用できるインスタンスが複数ある場合は、@Qualifierアノテーションを使用してあいまいさを解決できます。 @Qualifierは注入ポイントで使用されるため、@Qualifierを使用したくない、または使用できない2つの状況があります。

  1. 自動配線モードがAutowire.BY_TYPEの場合。もちろん、@Qualifierまたは@Autowiredとして指定されたユーザー定義のインジェクションポイントがないため、@Injectは使用できません
  2. Beanの開発時ではなく、構成時にBeanの選択(つまり、あいまいさの解決)を行います。

上記の問題の解決策は、@Primary注釈を使用することです。

@ Primary

これは、複数のBeanが単一値の依存関係に自動接続される候補である場合、特定のBeanに優先順位を与える必要があることを示します。候補の中に正確に1つの「プライマリ」Beanが存在する場合、それは自動配線された値になります。

5
rimonmostafiz