Вопрос проверяет понимание аннотации @Qualifier в Spring для разрешения неоднозначностей при внедрении зависимостей, когда существует несколько бинов одного типа.
В Spring Framework внедрение зависимостей (Dependency Injection, DI) — это ключевой механизм, позволяющий контейнеру управлять созданием и связыванием объектов (бинов). Однако, когда в контексте Spring определено несколько бинов одного типа (например, несколько классов, реализующих один интерфейс), контейнер сталкивается с неоднозначностью и не знает, какой именно бин внедрить. Аннотация @Qualifier решает эту проблему, позволяя разработчику явно указать, какой бин следует использовать.
Вы можете пометить бин квалификатором при его определении (например, в конфигурационном классе с помощью @Bean или на самом классе с @Component). Затем, при внедрении зависимости (через @Autowired), вы указываете тот же квалификатор, чтобы связать их. Квалификатором может быть строка, заданная в аннотации.
Предположим, у нас есть интерфейс NotificationService и две его реализации: для email и SMS.
public interface NotificationService {
void send(String message);
}
@Component("emailService")
public class EmailService implements NotificationService {
public void send(String message) {
System.out.println("Sending email: " + message);
}
}
@Component("smsService")
public class SmsService implements NotificationService {
public void send(String message) {
System.out.println("Sending SMS: " + message);
}
}Теперь в классе, где требуется внедрить зависимость, используем @Qualifier для выбора конкретной реализации:
@Service
public class NotificationClient {
private final NotificationService service;
@Autowired
public NotificationClient(@Qualifier("emailService") NotificationService service) {
this.service = service;
}
public void notifyUser(String msg) {
service.send(msg);
}
}В этом примере @Qualifier("emailService") указывает Spring, что нужно внедрить бин с именем "emailService", который соответствует реализации EmailService. Без этой аннотации Spring выбросит исключение из-за неоднозначности, так как найдёт два бина типа NotificationService.
Вывод: Используйте @Qualifier в Spring, когда необходимо явно указать, какой из нескольких бинов одного типа должен быть внедрён, чтобы разрешить неоднозначности контейнера и сделать конфигурацию зависимостей более контролируемой и читаемой.