繁体   English   中英

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

[英]Spring 5 - custom qualifiers for @Bean methods - NoSuchBeanDefinitionException

我一直在努力将自定义@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 "";
}

所需豆类的工厂 class 包括以下两种方法:

@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();
}

接下来,在客户端 class 中,我进行了 ctor 注入,如下所示:

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

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

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

相当有趣的事实是,当我添加一个专用的 class 扩展 RestTemplate 并将我的 @CustomQualifier 放在那里时,我得到了异常,现在实际上有两个 bean(即现在它确实考虑了 @Bean 方法)!

运行通过:IntelliJ Ultimate 2019.1 操作系统:Windows 10 64bit Java:1.8.0_191 Spring版本:

PS。 那些“Uno's 和 'Dos'ses 是为了强调一个事实,这些是一些具体的类型,完全不相关,但不要与 @Qualifiers 中的“Uno's 和 'Dos'ses 混淆

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

@Bean
public RestTemplate restTemplateUno(...) { ... }

@Bean
public RestTemplate restTemplateDos(...) { ... }

这会使用限定符“restTemplateUno”和“restTemplateDos”注册 bean,因为“默认情况下,bean 名称将与方法名称相同”(有关详细信息,请参阅Spring 文档)。

您现在可以将它们注入客户端构造函数中,如下所示:

@Autowired
public SomeClientUno(RestTemplate restTemplateUno) {...}

@Autowired
public SomeClientDos(RestTemplate restTemplateDos) {...}

我希望这会有所帮助,并且我没有错过一些明显的事情,这些事情导致您首先考虑使用限定符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM