Что делает аннотация @Primary в Spring?

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

Ответ

@Primary — это аннотация Spring, указывающая, что конкретный бин должен быть выбран по умолчанию при автоматическом связывании (autowiring), когда существует несколько бинов, подходящих по типу. Она разрешает неоднозначность внедрения зависимостей.

Пример сценария и решения:

// Два бина одного типа
@Component
@Primary // Этот бин будет выбран по умолчанию
public class PrimaryEmailService implements NotificationService {
    public void send(String msg) { /* ... */ }
}

@Component
public class SecondarySmsService implements NotificationService {
    public void send(String msg) { /* ... */ }
}

// Клиентский компонент
@Service
public class UserService {
    // Будет внедрён PrimaryEmailService
    @Autowired
    private NotificationService notifier;
}

Ключевые правила:

  • @Primary устанавливает бин по умолчанию для своего типа.
  • Если есть несколько бинов с @Primary одного типа — Spring выбросит исключение NoUniqueBeanDefinitionException.
  • Приоритет: Аннотация @Qualifier имеет более высокий приоритет, чем @Primary. Если указан @Qualifier, он будет использован для точного выбора.
  • Может применяться вместе с @Bean в конфигурационных классах:
    @Configuration
    public class AppConfig {
        @Bean
        @Primary
        public DataSource primaryDataSource() { return ...; }
    }