У меня есть следующий тест:
@SpringJUnitConfig(SpringContextTest.Foo.class)
public class SpringContextTest {
@Autowired
private Predicate<Double> predicate;
@Configuration
public static class Foo {
@Bean
@Scope("prototype")
public <T extends Number> Predicate<T> numberPredicate() {
return t -> true;
}
@Bean
@Scope("prototype")
public <T extends CharSequence> Predicate<T> charSequencePredicate() {
return t -> true;
}
}
@Test
public void foo() {
}
}
Я хотел бы добавить экземпляр компонента numberPredicate
в SpringContextTest.predicate
. Однако проверка как таковая приводит к ошибке:
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying
bean of type 'java.util.function.Predicate<java.lang.Double>' available: expected
single matching bean but found 2: numberPredicate,charSequencePredicate
Причиной использования параметра типа в методе @Bean
и @Scope("prototype")
было то, что я думал, что тогда Spring сможет создавать экземпляры различных бинов и регистрировать их соответствующим образом в зависимости от параметра типа, используемого в поле, которое нужно вставить. .
Я знаю, что описанный выше тест работает, если я заменил объявление predicate
на
@Autowired
private Predicate<? super Double> predicate;
Но это налагает бремя на клиентов, использующих боб, и поэтому я хотел бы избежать этого.
Я также хотел бы избежать использования @Qualifier("numberPredicate")
, чтобы не зависеть от имен бинов.
Так есть ли способ вставить правильный бин в поле predicate
?