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

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

3 ответов


читать @Primary это "по умолчанию".

если Боб имеет @Autowired без любой @Qualifier, и несколько бобов типа существуют, Боб-кандидат отмечен @Primary будет выбран, т. е. это выбор по умолчанию, когда никакая другая информация не доступна, т. е. когда @Qualifier отсутствует.

хорошим вариантом использования является то, что изначально у вас был только один боб типа, поэтому ни один из кода не использовался @Qualifier.

когда вы добавляете еще один боб, затем вы также добавляете @Qualifier как старый, так и новый боб, поэтому любой @Autowired можете выбрать, какой он хочет.

путем добавления @Primary к старому оригинальному Бобу вам не нужно добавлять @Qualifier для всех существующих @Autowired. Они, так сказать," дедушки".

@Primary также хорошо, если, например, 95%@Autowired хочет определенный Боб. Таким образом, только @Autowired хотите, чтобы другой Боб(ы) должен указать @Qualifier. Таким образом, у вас есть первичные бобы, которые все autowired хочет, и @Qualifier используется только для запроса "запасной" в зернах.


@Qualifier следует использовать в сочетании с @Autowired всегда. Это укажет имя компонента, которое должно быть автоматически подключено в случае нескольких компонентов с одинаковым типом в контексте приложения.(так что весна может autowire по имени.)

@Primary следует использовать в сочетании с @Bean / @Autowired который указывает, какой Боб должен быть отдан более высокое предпочтение, когда присутствует несколько бобов одного типа.

один из классических вариантов использования, где вы бы использовали @Primary - это когда платформа (пример spring-data) ожидает Боб какого-либо типа (пример EntityManager), но у вас есть несколько источников данных, и вы бы настроили несколько менеджеров сущностей. В таких случаях @Qualifier не совсем поможет.


@квалификатор

если для точки впрыска доступно более одного экземпляра, то мы можем использовать @Qualifier аннотация для устранения двусмысленности. As @Qualifier используется в месте инъекции, возможны две ситуации, когда мы не хотим или не можем использовать @Qualifier.

  1. когда режим autowiring Autowire.BY_TYPE. Тогда, конечно, мы не можем использовать @Qualifier потому что у нас на самом деле нет пользовательской точки инъекции, указанной как @Autowired или @Inject
  2. мы хотим сделать выбор фасоли (т. е. разрешить двусмысленность) на время конфигурации, а не во время разработки бобов.

решение вышеуказанных проблем заключается в использовании @Primary Примечание.

@Primary

это указывает на то, что конкретному Бобу следует отдать предпочтение, когда несколько бобов являются кандидатами для автоматического подключения к однозначной зависимости. Если точно один "первичный" Боб существует среди кандидаты, это будет значение autowired.