Ответ
@Primary указывает Spring IoC-контейнеру, что данный бин должен быть выбран по умолчанию при наличии нескольких бинов, подходящих для автоматического связывания (autowiring) по одному типу. Это решает проблему неоднозначности (NoUniqueBeanDefinitionException).
Пример срабатывания:
public interface PaymentService {
void process();
}
@Component
@Primary // Этот бин будет выбран по умолчанию
public class CreditCardService implements PaymentService {
public void process() { /* оплата картой */ }
}
@Component
public class PayPalService implements PaymentService {
public void process() { /* оплата через PayPal */ }
}
@Component
public class OrderService {
// Будет внедрен CreditCardService, так как он помечен @Primary
@Autowired
private PaymentService paymentService;
}
Приоритеты разрешения неоднозначности (от высшего к низшему):
@Qualifier("имя")— явное указание имени бина.@Primary— указание бина по умолчанию.- Имя переменной/поля — если имя совпадает с именем бина (например,
payPalService). - Исключение
NoUniqueBeanDefinitionException, если конфликт не разрешен.