Попробую уточнить:
@ Component - Это жестко связано с автоматической настройкой пружины и сканированием компонента.Все, помеченное Компонентом, будет выбрано, если оно у вас есть на пути сканирования компонента, определенного аннотацией @ComponentScanned.@Components бывают трех видов:
A) Хранилища - используются для постоянства
B) Контроллеры, например RestController
C) Служба - служба без состояния.F.ex a Facade.
Эта аннотация используется для автоматизации построения контекста приложения, а также для определения стереотипа для bean-компонента, привязанного к контексту.
@Bean - @Bean и @Component имеют одну и ту же цель, но @Bean не является @Component.Они оба создают контекст приложения, но делают это совсем по-другому.В то время как @Component определяет стереотип класса и говорит Spring забрать его.Бин несет полную ответственность за ручную настройку экземпляра того, что вы создаете.Реализация и конфигурация полностью разделены, и вы получаете более высокую степень контроля над тем, как именно генерируется Бин.
@ Configuration используется вместе с @Bean.@Bean в отличие от @Component является аннотацией уровня метода, поэтому обычно случается, что класс помечается @Configuration, а затем следуют еще один или несколько методов, аннотированных @Bean.
В вашем конкретном случаепример Вы создали маршрутизатор @Bean.Маршрутизатор был создан на основе автозаполнения и проверки, введенных в маршруты.Spring смог выяснить, что вводить, основываясь на наиболее подходящем кандидате.Поскольку у вас есть один экземпляр компонента, реализующий два интерфейса AutoComplete, он проверяет его.В вашем случае автозаполнение и проверка будут указывать на один и тот же экземпляр.