首页 > 解决方案 > 在@Bean 定义中使用@Qualifier 的用例是什么?

问题描述

我知道@Qualifier 和@Bean 注释的含义,但是在这样的代码中使用它有什么意义呢?这是为了覆盖“loadBalancedRestTemplate”bean 还是什么?

@Bean
@Qualifier("loadBalancedRestTemplate")
public RestTemplate restTemplate(RestTemplateCustomizer customizer) {
    RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory());
    customizer.customize(restTemplate);
    return restTemplate;
}

标签: spring

解决方案


您可以使用:

@Bean(name="loadBalancedRestTemplate")
public RestTemplate restTemplate(RestTemplateCustomizer customizer)...

或者您可以互换发布的那个。

默认情况下,使用@Autowiredspring 时会找到匹配类型的 bean 并注入该 bean。问题是,如果您有多个相同类型的 bean,它将不知道要注入哪一个。根据您的代码,您可以在其中指定@Qualifier配置中的 bean 名称。在@Autowired目标中,您将指定相同@Qualifier的内容来告诉 Spring 要使用哪个 bean。

一个常见的用例RestTemplate是需要在多个由于某种原因工作方式不同的休息端点上进行调用。在这种情况下,例如根据您尝试调用的端点使用具有不同参数的setErrorHandleror方法或在代码中使用 as 是很常见的。setMessageConvertersRestTemplateCustomizer

在您的特定情况下,应用的自定义loadBalancedRestTemplate取决于提供的RestTemplateCustomizer. 根据该对象的创建方式,您的特定代码可能会或可能不会被修改为简单地返回RestTemplate.

就目前而言,假设一切都是出于正当理由完成的,我只能推测:

  • 不同@Service的类会使用不同的RestTemplate实例来调用不同的服务
  • 您的代码库中有另一个@Bean定义RestTemplateCustomizer
  • 其他RestTemplate实例不会使用它RestTemplateCustomizer,因此使它们与您提供的代码中的不同

推荐阅读