我在工厂方法上使用自定义@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 ....
这似乎太明显了,但是为什么要使用限定词呢?假设您这样定义bean: