Ответ
Если в контексте Spring определено несколько бинов одного типа, возникает неоднозначность внедрения зависимостей. Без дополнительных указаний Spring выбросит NoUniqueBeanDefinitionException.
Способы разрешения неоднозначности:
- Аннотация
@Primary: Помечает бин как предпочтительный кандидат для автосвязывания. - Аннотация
@Qualifier: Позволяет указать конкретное имя бина при инжекции. - Аннотация
@Resource(JSR-250): Внедрение по имени бина.
Пример конфигурации и использования:
@Configuration
public class AppConfig {
@Bean
@Primary // Этот бин будет выбран по умолчанию
public DataSource primaryDataSource() {
return new H2DataSource();
}
@Bean
public DataSource secondaryDataSource() {
return new PostgresDataSource();
}
}
@Component
public class MyService {
// Внедрение по умолчанию (primaryDataSource)
@Autowired
private DataSource defaultDataSource;
// Внедрение конкретного бина по имени
@Autowired
@Qualifier("secondaryDataSource")
private DataSource specificDataSource;
// Внедрение по имени с использованием @Resource
@Resource(name = "secondaryDataSource")
private DataSource namedDataSource;
}
Важно: Имя бина по умолчанию — это имя метода-создателя (primaryDataSource, secondaryDataSource).