【发布时间】:2020-03-21 22:17:52
【问题描述】:
我刚刚发现了我无法理解的 Spring 行为。我正在使用 Spring Boot 1.5.x。
在一个配置类中,我声明了两个不同的 bean。
@Configuration
class Config {
@Bean("regularRestTemplate")
public RestTemplate regularRestTemplate(String toLog) {
return new RestTemplateBuilder().setConnectTimeout(100)
.setReadTimeout(100)
.additionalInterceptors((request, body, execution) -> {
log.info("Inside the interceptor {}", toLog);
return execution.execute(request, body);
})
.build();
}
@Bean("exceptionalRestTemplate")
public RestTemplate regularRestTemplate() {
return new RestTemplateBuilder().setConnectTimeout(100)
.setReadTimeout(100)
.build()
}
}
然后,我有一个类应该使用名为 exceptionalRestTemplate 的 bean。
@Component
class Client {
private RestTemplate restTemplate;
@Autowired
public Client(@Qualifier("exceptionalRestTemplate") RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
// Code that uses the injected rest template
}
由于我使用@Qualifier 注释指定了要注入的bean 的名称,我希望Spring 注入名为exceptionalRestTemplate 的bean。但是,在注入过程中实际上使用了名为regularRestTemplate 的bean。
原来问题出在在配置类中声明 bean 的方法的名称上。两者都收集regularRestTemplate。更改第二个方法名,解决问题。
我的问题是,为什么?我知道 Spring 使用带有 @Bean 或 @Component、@Service 等注释的类和方法的名称来为解析图中的 Java 对象命名。但是,我认为在这些注释中命名会覆盖这种行为。
有人告诉我发生了什么事吗?
【问题讨论】:
-
这些方法用作工厂方法,在
ConfigurationClassBeanDefinitionReader中对此进行了特殊处理。在 2 个单独的@Configuration带注释的类中执行此操作。
标签: java spring spring-boot dependency-injection