java - 当有两个用@Qualifier定义的候选者时,Spring如何决定注入(inject)哪个bean?

标签 java spring spring-boot autowired

假设我有两个像这样定义的bean:

@Configuration
public class ConfigurationA {

    @Bean
    @Qualifier("restTemplateA")
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();

        //setting some restTemplate properties

        return restTemplate;
    }
}
<小时/>
@Configuration
public class ConfigurationB {

    @Bean
    @Qualifier("restTemplateB")
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();

        //setting some restTemplate properties

        return restTemplate;
    }
}

当我 Autowiring restTemplate而不提供@Qualifier时,将注入(inject)哪个bean?怎么决定的?

@Service
public class someClass {

    @Autowired
    private RestTemplate restTemplate;

} 

注意:当我测试时,注入(inject)了其中一个 bean。它没有导致任何异常。

注2:我知道我可以使用@Qualifier来注入(inject)我想要的bean,或者我可以使用@Primary来避免歧义。但我只是想了解为什么它对 Spring 有效。

注3:当我将类ConfigurationB中的方法名称更改为restTemplateB时,会注入(inject)ConfigurationA中定义的bean。同样,它没有导致任何异常。

我在 Spring Boot 版本 1.4.4 中尝试过此操作

最佳答案

我想你会发现,如果你运行你的应用程序,它会记录一个错误,比如requried a single bean but 2 were found

但是,您可以做的是使用 @Qualifier 在您需要注入(inject)的地方消除歧义并命名您的 bean 定义,即对于您的示例。

@Configuration
public class Configuration {

    @Bean(name="restTemplateA")
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();

        //setting some restTemplate properties

        return restTemplate;
    }

    @Bean(name="restTemplateB")
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();

        //setting some restTemplate properties

        return restTemplate;
    }
}

然后当您开始注入(inject)和使用模板时

@Service
public class someClass {

    @Autowired
    @Qualifer("restTemplateA")
    private RestTemplate restTemplate;

} 

但是,您也可以使用 @Primary 将其中一个模板标记为 Primary,然后该 Bean 将在您不符合 Autowiring 条件的每个地方使用。

    @Bean(name="restTemplateA")
    @Primary
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();

        //setting some restTemplate properties

        return restTemplate;
    }

关于java - 当有两个用@Qualifier定义的候选者时,Spring如何决定注入(inject)哪个bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60229220/

相关文章:

java - 需要 Spring 服务、存储库、实体设计模式建议

java - Spring Web应用程序+ Hibernate问题: Unsatisfied dependency expressed through field

java - 线程“kafka-生产者-网络-线程”中未捕获的异常 |生产者1

Java - Spring Boot - Mysql/Java - 从表的列中获取车辆类型并从另一个表中获取其总计数(数量)

java - 如何在eclipse中安装Hibernate

spring - 第三方健康端点最佳实践

java - 如何使用 Play Framework 访问 JNDI 数据源

java - 如何持久化实体类中的数据并与数据传输对象结合?

swing - GridBagLayout 多按钮+边框

java - 典型的 EJB3/JPA/JSF 中的事务范围是什么?