我有以下测试:
@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() {
}
}
我想向SpringContextTest.predicate
注入一个bean numberPredicate
的实例。但是,按原样测试会导致以下错误:
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将能够实例化不同的bean,并根据要注入的字段中使用的类型参数相应地注册它们。
我知道如果我将predicate
的声明替换为
@Autowired
private Predicate<? super Double> predicate;
但是这给使用bean的客户端带来了负担,因此我希望避免这种情况。
我还希望避免使用@Qualifier("numberPredicate")
来不依赖于bean名称。
那么有没有办法将正确的bean注入到字段predicate
中呢
发布于 2019-06-14 03:22:02
有界通配符或@Qualifier
非常适合这种情况,但是,正如您所说的,您不喜欢依赖bean名称,因此可以使用@Primary
注释来指示首选的bean,或者使用
@Autowired
private List<Predicate<Double>> predicate;
并在类构造函数或@PostConstruct
方法中手动选择您喜欢的bean。
https://stackoverflow.com/questions/56578054
复制相似问题