在工厂方法上,我一直在使用自定义@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.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”混淆了。