Разница между @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
.
- когда режим autowiring
Autowire.BY_TYPE
. Тогда, конечно, мы не можем использовать@Qualifier
потому что у нас на самом деле нет пользовательской точки инъекции, указанной как@Autowired
или@Inject
- мы хотим сделать выбор фасоли (т. е. разрешить двусмысленность) на время конфигурации, а не во время разработки бобов.
решение вышеуказанных проблем заключается в использовании @Primary
Примечание.
@Primary
это указывает на то, что конкретному Бобу следует отдать предпочтение, когда несколько бобов являются кандидатами для автоматического подключения к однозначной зависимости. Если точно один "первичный" Боб существует среди кандидаты, это будет значение autowired.