Ответ
Поведение зависит от конфигурации:
- Если одна реализация помечена
@Primary— будет выбран этот бин. - Если нет
@Primary, но имя поля совпадает с именем одного из бинов — может быть выбран этот бин (но это поведение не всегда однозначно). - В остальных случаях — Spring выбросит
NoUniqueBeanDefinitionException.
Пример проблемы и решений:
public interface PaymentService {
void process();
}
@Service("cardService")
public class CardPaymentService implements PaymentService { /*...*/ }
@Service("paypalService")
public class PayPalPaymentService implements PaymentService { /*...*/ }
@Component
public class OrderProcessor {
@Autowired // ОШИБКА: NoUniqueBeanDefinitionException
private PaymentService paymentService;
}
Способы разрешения:
- Использование
@Primary:@Service @Primary // Теперь этот бин будет выбран по умолчанию public class CardPaymentService implements PaymentService { /*...*/ } - Использование
@Qualifier(предпочтительно для ясности):@Component public class OrderProcessor { @Autowired @Qualifier("paypalService") // Явно указываем, какую реализацию использовать private PaymentService paymentService; } - Инжекция Map или List всех реализаций:
@Autowired private Map<String, PaymentService> allPaymentServices; // Ключ — имя бина