Spring 5-@Bean方法的自定义限定词-NoSuchBeanDefinitionException

问题描述 投票:0回答:1

我在工厂方法上使用自定义@Qualifier和@Bean在一起已经有一段时间了。看起来像这样:

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, 
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface MyCustomQualifierUno {
    String value() default "";
}

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, 
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface MyCustomQualifierDos {
    String value() default "";
}

并且所需bean的工厂类包括以下两种方法:

@Bean
@MyCustomQualifierUno
public RestTemplate getRestTemplate(SomeConfigUno config,
    SomeErrorHandlerUno errorHandler) {
        return new RestTemplateBuilder()
            (...)
            .build();
}

@Bean
@MyCustomQualifierDos
public RestTemplate getRestTemplate(SomeConfigDos config,
    SomeErrorHandlerDos errorHandler) {
        return new RestTemplateBuilder()
            (...)
            .build();
}

接下来,在Client类中,我进行了ctor注入,如下所示:

public SomeClientUno(@SomeQualifierUno RestTemplate 
    restTemplate) {
        this.restTemplate = restTemplate;
}

public SomeClientDos(@SomeQualifierDos RestTemplate 
    restTemplate) {
        this.restTemplate = restTemplate;
}

[当我尝试运行该应用程序时,我得到:NoSuchBeanDefinitionException

非常有趣的事实是,当我添加一个扩展RestTemplate的专用类并将其放置在我的@CustomQualifier上时,我得到了例外,实际上现在有两个bean(即,现在它确实考虑了@Bean方法)!] >

运行时间:IntelliJ Ultimate 2019.1操作系统:Windows 10 64bit的Java:1.8.0_191春季版:5.1.9

PS。这些“ Uno和Dos”是为了强调这一事实,它们是一些具体的类型,虽然无关紧要,但不要与@Qualifiers中的“ Uno和Dos”混淆。

我在工厂方法上使用自定义@Qualifier和@Bean在一起已经有一段时间了。看起来像这样:@Target({ElementType.FIELD,ElementType.METHOD,ElementType ....

java spring javabeans
1个回答
1
投票

这似乎太明显了,但是为什么要使用限定词呢?假设您这样定义bean:

© www.soinside.com 2019 - 2024. All rights reserved.