Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Spring: Spring, dependency injection, bean, qualifier, primary

Как выбрать нужный бин при наличии нескольких?

Вопрос проверяет понимание механизмов разрешения конфликтов бинов в Spring-контейнере при наличии нескольких кандидатов одного типа.

Короткий ответ

Если в контексте Spring есть несколько бинов одного типа, нужно указать, какой из них использовать. Для этого применяют аннотацию @Primary для основного бина или @Qualifier с уникальным именем. Также можно использовать @Resource с указанием имени бина. Если не указать, Spring выбросит исключение NoUniqueBeanDefinitionException.

Длинный ответ

Проблема множественных бинов

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

Основные способы разрешения

  • @Primary — помечает бин как основной. Если не указан @Qualifier, будет использован бин с @Primary.
  • @Qualifier — позволяет указать конкретное имя бина при внедрении. Имя задаётся в аннотации @Component("имя") или @Bean(name = "имя").
  • @Resource — стандартная аннотация Java, принимает атрибут name для указания имени бина.

Пример кода

@Component("smsService")
public class SmsNotification implements Notification {
    public void send(String message) { /* ... */ }
}

@Component("emailService")
@Primary
public class EmailNotification implements Notification {
    public void send(String message) { /* ... */ }
}

@Service
public class NotificationService {
    @Autowired
    @Qualifier("smsService")
    private Notification notification;
}

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

Вывод

Используйте @Primary для задания бина по умолчанию, а @Qualifier для точного выбора, когда нужно явно указать реализацию. Это делает код гибким и понятным при работе с несколькими реализациями одного интерфейса.

Уровень

  • Рейтинг:

    4

  • Сложность:

    4

Навыки

  • Spring

    Spring

Ключевые слова

#Spring

#dependency injection

#bean

#qualifier

#primary

Подпишись на Java Developer в телеграм