假设我有两个像这样定义的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/