Какую роль играет аннотация @Primary в Spring?

«Какую роль играет аннотация @Primary в Spring?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

@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; 
}

Приоритеты разрешения неоднозначности (от высшего к низшему):

  1. @Qualifier("имя") — явное указание имени бина.
  2. @Primary — указание бина по умолчанию.
  3. Имя переменной/поля — если имя совпадает с именем бина (например, payPalService).
  4. Исключение NoUniqueBeanDefinitionException, если конфликт не разрешен.