spring5-@bean方法的自定义限定符-nosuchbeandefinitionexception

ycl3bljg  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(354)

我一直在努力使用自定义@qualifier和@bean over the factory方法。看起来是这样的:

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

接下来,在客户机类中,我有一个如下所示的ctor注入:

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

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

当我尝试运行应用程序时,我得到:nosuchbeandefinitionexception
非常有趣的是,当我添加一个扩展restemplate的专用类并将@customqualifier放在那里时,我得到了一个异常,实际上现在有两个bean(即现在它确实考虑了@bean方法)!
运行:intellij ultimate 2019.1 os:windows 10 64位java:1.8.0¿spring版本:5.1.9
这些“uno”和“dos”是为了强调一个事实,那就是那些是一些具体的类型,非常不相关,但是不要与@限定符中的“uno”和“dos”混淆

3npbholx

3npbholx1#

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

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

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

这将使用限定符“restemplateuno”和“restemplatedos”注册bean,因为“默认情况下,bean名称将与方法名称相同”(有关详细信息,请参阅spring文档)。
现在可以将它们注入到客户端构造函数中,如下所示:

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

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

我希望这会有所帮助,而且我没有错过一些明显的东西,这些东西让您首先考虑使用限定符。

相关问题