Spring @Primary - зачем создавать другой компонент, если существует основной - PullRequest
0 голосов
/ 26 ноября 2018

Я не понимаю, какую проблему @Primary решает.
Документация гласит:

Указывает, что бобу следует отдавать предпочтение, когда несколько кандидатов имеют право на автоматическую передачу однозначных значений.зависимость.Если среди кандидатов существует только один «основной» компонент, это будет значение с автопроводкой.

Пример кода:

@Configuration
class Configuration {
   @Bean
   @Primary
   MyType bean1() {
       return new MyType(1);
   }

   @Bean
   MyType bean2() {
       return new MyType(2);
   }
}

Пример : у меня есть2 бина bean1 и bean2, которые возвращают объект типа MyType.Один из них bean1 имеет аннотацию @Primary, поэтому, когда я вставлю объект типа MyType в какой-либо конструктор, объект, созданный bean1, будет введен.

Так почему же у меня может быть два компонентатого же типа, если основной бин будет введен?Какой смысл?Когда и как я могу использовать bean2, который не помечен как основной?Пример показывает, что bean2 является избыточным и не используется.

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Скажем, у вас есть несколько экземпляров бинов, которые имеют некоторые различия между ними.Во многих случаях (например,> 90%) вам понадобится один из них, а другие вы будете использовать редко.В этом случае имеет смысл пометить @Primary наиболее часто используемым, и таким образом он будет напрямую добавлен платформой, если не будет предоставлена ​​дополнительная спецификация.В другом случае вы укажете точный bean-компонент для использования с помощью аннотации @Qualifier.

Примером может быть инициализация bean-компонента RestTemplate, скажем, вы определите глобальный компонент, который будет иметь общие настройки и будетиспользоваться во всех приложениях, а другое - с определенной политикой повторов для небольшого набора вариантов использования.

0 голосов
/ 26 ноября 2018

Так почему же у меня могут быть два компонента одного типа, если будет введен основной компонент?

На самом деле primary bean будет введен только , если вы не указали, какой из ваших бобов вы хотите внедрить, и используется @Primaryчтобы указать, какой bean-компонент будет внедрен, когда тип не указан .

И чтобы ответить на ваш вопрос, наличие двух бинов одного типа является распространенным способом предоставления разных реализаций, во многих случаяхмы хотим использовать два bean-компонента одного и того же bean-компонента, наиболее распространенная ситуация - когда мы хотим указать два источника данных для одного и того же приложения.

И чтобы указать, с каким из наших bean-компонентов мы хотим работать, мыиспользуйте аннотацию @Resource следующим образом:

@Resource(name="bean2")
MyType bean;

Для получения более подробной информации вы можете проверить обсуждаемые различия между @Resource и @Autowired.

0 голосов
/ 26 ноября 2018

Вы по-прежнему всегда можете определить, какой бин вам действительно нужен, то есть основной не всегда будет выбран.

@Component
class MyComponent
{
    public MyComponent(@Qualifier("bean2") MyType foo) { /*...*/ } 
}

@Primary просто сообщает Spring, какой бин выбрать, если есть два или более возможныхКандидаты на авто-проводное поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...