したがって、私が正しく理解していれば、両方が複数の候補がある場合にどちらのBeanを自動配線するかを決定する方法です。それで、違いは正確に何ですか?
「デフォルト」として @Primary
を読み取ります。
Beanに@Autowired
withoutany @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を要求するためにのみ使用されます。
@Qualifier
は常に@Autowired
と組み合わせて使用する必要があります。これは、同じタイプの複数のBeanがアプリケーションコンテキストに存在する場合に自動配線する必要があるBean名を示します(したがって、スプリングは名前で自動配線できます)。
@Primary
は、@Bean
/@Autowired
と組み合わせて使用する必要があります。これは、同じタイプのBeanが複数存在する場合に、より高い優先度を与える必要があるBeanを示します。
@Primary
を使用する古典的な使用例の1つは、フレームワーク(スプリングデータの例)が何らかのタイプのBean(EntityManagerの例)を予期しているが、複数のデータソースがあり、複数のEntity Managerを構成した場合です。そのような場合、@Qualifier
はまったく役に立ちません。
@ Qualifier
インジェクションポイントで使用できるインスタンスが複数ある場合は、@Qualifier
アノテーションを使用してあいまいさを解決できます。 @Qualifier
は注入ポイントで使用されるため、@Qualifier
を使用したくない、または使用できない2つの状況があります。
Autowire.BY_TYPE
の場合。もちろん、@Qualifier
または@Autowired
として指定されたユーザー定義のインジェクションポイントがないため、@Inject
は使用できません上記の問題の解決策は、@Primary
注釈を使用することです。
@ Primary
これは、複数のBeanが単一値の依存関係に自動接続される候補である場合、特定のBeanに優先順位を与える必要があることを示します。候補の中に正確に1つの「プライマリ」Beanが存在する場合、それは自動配線された値になります。