Что будешь делать, если в Spring контейнере будет больше одного бина одного типа
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Конфликты бинов в Spring контейнере
Это одна из самых частых проблем при работе с dependency injection в Spring. Когда в контейнере существует несколько бинов одного типа, Spring не знает, какой именно внедрить в зависимость.
Симптомы проблемы
При запуске приложения получишь исключение NoUniqueBeanDefinitionException:
Expected single matching bean but found 2: bean1, bean2
Решения
1. @Primary аннотация — выбираем главный бин
Указываем, какой бин использовать по умолчанию:
@Configuration
public class DataSourceConfig {
@Bean
@Primary
public DataSource primaryDataSource() {
return new DataSource();
}
@Bean
public DataSource secondaryDataSource() {
return new DataSource();
}
}
// При внедрении будет использован primaryDataSource
@Service
public class UserService {
@Autowired
private DataSource dataSource; // получит primaryDataSource
}
2. @Qualifier аннотация — явное указание имени бина
Указываем точное имя нужного нам бина:
@Service
public class UserService {
@Autowired
@Qualifier("secondaryDataSource")
private DataSource dataSource;
}
3. Именование конвенции
Spring может автоматически сопоставить имя параметра с именем бина:
@Service
public class UserService {
private DataSource secondaryDataSource; // совпадает с именем бина!
@Autowired
public UserService(DataSource secondaryDataSource) {
this.secondaryDataSource = secondaryDataSource;
}
}
4. Конкретный тип вместо интерфейса
Указываем конкретный класс вместо интерфейса:
@Bean
public class MySQLDataSource implements DataSource {
// конкретная реализация
}
@Service
public class UserService {
@Autowired
private MySQLDataSource dataSource; // инжектим конкретный класс
}
Лучшие практики
Используй @Qualifier в боевом коде — это явное и понятное решение. @Primary подходит для "по умолчанию" логики в конфигурации.
Структурируй код так, чтобы не было конфликтов:
- Разные интерфейсы для разных ролей
- Профили (profiles) для разных окружений
- Явные имена бинов
Избегай подвохов — не полагайся на конвенции имён в сложных проектах. Всегда используй @Qualifier или @Primary для ясности.