Итак, если я правильно понял, оба способа определить, какой bean автоуверен, если есть несколько кандидатов. Так в чем же разница?
Разница между @Primary vs @Autowired с аннотациями @Qualifier
Ответ 1
Прочитайте @Primary
как "по умолчанию".
Если у компонента есть @Autowired
без какого-либо @Qualifier
, и существует несколько компонентов такого типа, будет выбран кандидатный компонент, помеченный @Primary
, т.е. это выбор по умолчанию, когда другая информация недоступна, т.е. когда @Qualifier
отсутствует.
Хорошим вариантом использования является то, что изначально у вас был только один компонент типа, поэтому ни один из кодов не использовал @Qualifier
. Затем, когда вы добавляете другой bean-компонент, вы также добавляете @Qualifier
как к старому, так и к новому bean-компоненту, поэтому любой @Autowired
может выбрать, какой из них ему нужен. Также добавляя @Primary
к старому оригинальному компоненту, вам не нужно добавлять @Qualifier
ко всем существующим @Autowired
. Они, так сказать, "дедушкины".
@Primary
также хорош, если, например, 95% @Autowired
хочет определенный боб. Таким образом, только @Autowired
которому нужны другие bean-компоненты, должны указывать @Qualifier
. Таким образом, у вас есть основные bean-компоненты, которые нужны всем autowired, а @Qualifier
используется только для запроса "альтернативного" bean-компонента.
Ответ 2
@Qualifier
следует всегда использовать в сочетании с @Autowired
. Это укажет имя bean, которое должно быть Autowired, если в контексте приложения присутствует несколько beans с тем же типом. (Так что spring может автоопределять по имени.)
@Primary
следует использовать в сочетании с @Bean
/@Autowired
, который указывает, какой bean должен быть предоставлен более высокий приоритет, если присутствует несколько beans того же типа.
Один из классических вариантов использования @Primary
- это когда среда (пример spring -data) ожидает bean какого-либо типа (пример EntityManager), но у вас есть несколько источников данных, и вы бы настроили несколько менеджеров Entity. В таких случаях @Qualifier
не очень помогает.
Ответ 3
@Qualifier
Если для точки впрыска доступно несколько экземпляров, мы можем использовать аннотацию @Qualifier
для разрешения неоднозначности. Поскольку в точке ввода используется @Qualifier
, могут быть две ситуации, когда мы не хотим или не можем использовать @Qualifier
.
- Когда режим автосогласования
Autowire.BY_TYPE
. Тогда, конечно, мы не можем использовать@Qualifier
, потому что на самом деле у нас нет пользовательской точки инъекции, указанной как@Autowired
или@Inject
- Мы хотим сделать выбор bean (т.е. устранить двусмысленность) в времени конфигурации, а не во время beans времени разработки.
Решение вышеперечисленных проблем заключается в использовании аннотации @Primary
.
@Primary
Это указывает на то, что конкретному bean следует отдать предпочтение, когда несколько beans являются кандидатами, которые будут автоматически привязаны к однозначной зависимости. Если между кандидатами существует ровно один "первичный" bean, это будет значение с автоподдержкой.
Ответ 4
В одном посте, который я прочитал, указано, что @Qualifier используется на этапе внедрения, то есть с аннотацией Autowired, тогда как @Primary используется на этапе настройки (в классе, аннотированном @Configuration)
Будет ли это справедливо для этих аннотаций?
Еще несколько сомнений 1. Может ли @Primary не использоваться с @Autowired, может ли использоваться с @Bean? 2. @Primary часто используется как аннотация на уровне класса? (как @Configuration)