首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在这种情况下使用泛型时,如何使spring注入正确的bean?

在这种情况下使用泛型时,如何使spring注入正确的bean?
EN

Stack Overflow用户
提问于 2019-06-13 18:02:55
回答 1查看 296关注 0票数 0

我有以下测试:

代码语言:javascript
复制
@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的实例。但是,按原样测试会导致以下错误:

代码语言:javascript
复制
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的声明替换为

代码语言:javascript
复制
    @Autowired
    private Predicate<? super Double> predicate;

但是这给使用bean的客户端带来了负担,因此我希望避免这种情况。

我还希望避免使用@Qualifier("numberPredicate")来不依赖于bean名称。

那么有没有办法将正确的bean注入到字段predicate中呢

EN

回答 1

Stack Overflow用户

发布于 2019-06-14 03:22:02

有界通配符或@Qualifier非常适合这种情况,但是,正如您所说的,您不喜欢依赖bean名称,因此可以使用@Primary注释来指示首选的bean,或者使用

代码语言:javascript
复制
@Autowired
private List<Predicate<Double>> predicate;

并在类构造函数或@PostConstruct方法中手动选择您喜欢的bean。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56578054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档