Назад к вопросам
Junior — Middle
72
Как Spring определяет, какую реализацию интерфейса выбрать при использовании @Autowired, когда существует несколько вариантов
Компании, где спрашивали
Ifellow
Ответ от нейросети
sobes.tech AI
Когда в Spring есть несколько реализаций одного интерфейса, и используется аннотация @Autowired, фреймворк пытается определить, какую именно реализацию внедрить, исходя из следующих правил:
- По имени бина: Spring ищет бин, имя которого совпадает с именем поля или параметра, куда происходит внедрение.
- Аннотация
@Qualifier: Если есть несколько кандидатов, можно явно указать нужный бин с помощью@Qualifier("beanName"). - Аннотация
@Primary: Если один из бинов помечен как@Primary, он будет выбран по умолчанию. - Исключение при неоднозначности: Если ни одно из условий не помогает, Spring выбросит исключение
NoUniqueBeanDefinitionException.
Пример:
@Component
@Primary
public class ServiceImpl1 implements MyService {}
@Component
public class ServiceImpl2 implements MyService {}
@Autowired
private MyService myService; // будет внедрена ServiceImpl1 из-за @Primary
@Autowired
@Qualifier("serviceImpl2")
private MyService myService2; // явно указана ServiceImpl2