Этот вопрос проверяет понимание механизма внедрения зависимостей в Spring и способов разрешения неоднозначностей, когда контейнеру доступно несколько кандидатов для внедрения.
В Spring IoC-контейнер управляет объектами, называемыми бинами. Когда для внедрения зависимости (например, через @Autowired) существует несколько бинов одного типа, возникает конфликт, который необходимо разрешить явно.
@Component("myService")) и используется на месте инъекции.@Primary, по умолчанию, если не указан явный @Qualifier.Допустим, у нас есть интерфейс PaymentService и две его реализации.
public interface PaymentService {
void process();
}
@Component("cardPayment")
public class CardPaymentService implements PaymentService {
public void process() { System.out.println("Card payment"); }
}
@Component("bankTransfer")
@Primary
public class BankTransferService implements PaymentService {
public void process() { System.out.println("Bank transfer"); }
}Теперь рассмотрим класс, который нуждается в этом сервисе.
@Service
public class OrderProcessor {
// Способ 1: Использование @Primary (будет внедрён BankTransferService)
@Autowired
private PaymentService primaryService;
// Способ 2: Использование @Qualifier для явного указания
@Autowired
@Qualifier("cardPayment")
private PaymentService specificService;
// Способ 3: Внедрение через конструктор с @Qualifier
private final PaymentService service;
public OrderProcessor(@Qualifier("bankTransfer") PaymentService service) {
this.service = service;
}
}Этот механизм критически важен в модульных приложениях, где одна функциональность может иметь несколько реализаций (например, разные платёжные шлюзы, стратегии кэширования, источники данных для тестов и продакшена). Он позволяет гибко конфигурировать поведение приложения без изменения кода бизнес-логики.
Вывод: Используйте @Qualifier для явного и точного указания зависимости, когда контекст требует конкретной реализации. Аннотацию @Primary удобно применять для задания реализации по умолчанию в модульных тестах или при наличии одной основной реализации среди многих.