Ответ
@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 ...; } }