Когда следует использовать аннотацию @Qualifier в Spring?

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

Ответ

@Qualifier используется для устранения неоднозначности (ambiguity) при внедрении зависимостей, когда в контексте Spring существует несколько бинов, подходящих под требуемый тип.

Основной сценарий: несколько реализаций одного интерфейса.

// 1. Определяем несколько бинов одного типа (MyService)
@Component
@Qualifier("emailService")
public class EmailService implements MyService { /* ... */ }

@Component
@Qualifier("smsService")
public class SmsService implements MyService { /* ... */ }

// 2. Внедряем конкретный бин с помощью @Qualifier
@Service
public class NotificationClient {
    private final MyService service;

    @Autowired
    public NotificationClient(@Qualifier("smsService") MyService service) {
        this.service = service; // Будет внедрен SmsService
    }
}

Ключевые моменты:

  • @Primary задает бин по умолчанию, а @Qualifier позволяет явно выбрать конкретный.
  • Может использоваться совместно с @Autowired на полях, сеттерах и конструкторах.
  • Позволяет выбирать конкретные бины при инъекции коллекций (List<MyService>), если это необходимо.