Разница между @Primary vs @Autowired с аннотациями @Qualifier

Итак, если я правильно понял, оба способа определить, какой bean автоуверен, если есть несколько кандидатов. Так в чем же разница?

Ответ 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)