Как Spring определяет, что внедряемый объект является требуемым
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Как Spring определяет требуемый объект для внедрения
Spring использует многоуровневый механизм для определения соответствия бина требуемому типу при внедрении зависимостей. Этот процесс критически важен для корректной работы контейнера IoC.
1. Первичный фильтр: По типу (Type Matching)
Когда Spring встречает точку внедрения (field, constructor параметр, setter), он определяет требуемый тип:
@Component
public class OrderService {
@Autowired
private PaymentProcessor processor; // Требуемый тип: PaymentProcessor
}
Spring ищет в контексте все бины, которые являются экземплярами PaymentProcessor или его подклассов.
2. Сужение кандидатов: Автопровод (Autowire Candidate)
Не все бины участвуют в автопроводе. Spring учитывает флаг autowire-candidate:
@Configuration
public class Config {
@Bean(autowireCandidate = false)
public PaymentProcessor primaryProcessor() { }
@Bean
public PaymentProcessor secondaryProcessor() { }
}
3. Использование квалификаторов (Qualifier)
Если осталось несколько подходящих бинов, Spring использует квалификаторы для точного выбора:
@Component
public class OrderService {
@Autowired
@Qualifier("stripeProcessor")
private PaymentProcessor processor;
}
@Component("stripeProcessor")
class StripeProcessor implements PaymentProcessor { }
4. @Primary приоритет
Если квалификатор не указан, Spring выбирает бин с @Primary:
@Configuration
public class Config {
@Bean
@Primary
public PaymentProcessor primaryProcessor() {
return new StripeProcessor();
}
}
5. Согласование по имени (Name Matching)
Spring пытается совместить имя параметра с именем бина:
@Autowired
private PaymentProcessor stripeProcessor; // Совпадает с именем бина
6. Порядок резолюции
- Фильтрация по типу (Type)
- Исключение неавтопроводимых (autowire-candidate=false)
- Применение @Qualifier
- Поиск @Primary
- Согласование по имени
- Ошибка NoUniqueBeanDefinitionException
7. ObjectProvider для опционального внедрения
@Component
public class Service {
@Autowired
private ObjectProvider<PaymentProcessor> processorProvider;
public void process() {
processorProvider.ifAvailable(processor -> processor.process());
}
}
Этот механизм гарантирует, что Spring найдёт именно тот бин, который соответствует требуемому типу и условиям приоритизации.