gpt4 book ai didi

java - Spring中使用@Bean和@Qualifier注释的Bean名称解析

转载 作者:行者123 更新时间:2023-12-02 09:07:13 26 4
gpt4 key购买 nike

我刚刚发现了 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 注释指定了要注入(inject)的 bean 名称,因此我希望 Spring 注入(inject)名为 exceptionalRestTemplate 的 bean。然而,名为 regularRestTemplate 的 bean 实际上是在注入(inject)过程中使用的。

事实证明,问题出在配置类中声明 bean 的方法名称中。两者都被合并为regularRestTemplate。更改第二个方法名,问题解决。

我的问题是,为什么?我知道 Spring 使用用 @Bean@Component@Service 等注释的类和方法的名称...注释为解析映射内的 Java 对象命名。但是,我认为在这些注释中给出名称会覆盖此行为。

有人告诉我这是怎么回事吗?

最佳答案

Bean 限定符和 Bean 名称是不同的含义。您限定了新 bean,但试图覆盖它(参数并不重要)。在您的应用程序中,您无法覆盖 beans,因此您只有第一个。

你可以检查这个“理论”。在配置中添加参数

spring.main.allow-bean-definition-overriding=true

然后再次启动您的应用程序。之后,您将只有第二个 bean。

这是对碰撞的解释。但解决方案是将 bean 分离到不同的配置。

关于java - Spring中使用@Bean和@Qualifier注释的Bean名称解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59051895/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com