spring - 为什么当restTemplate存在两个@Bean方法时Spring Boot应用程序启动
问题描述
我有这个依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
我有这个配置:
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder
.setConnectTimeout(ofMillis(3000))
.setReadTimeout(ofMillis(3000))
.build();
}
}
我想知道为什么 Spring 在启动时不会失败。它从不初始化第一个restTemplate,而是初始化第二个。我预计 Spring 会失败。
解决方案
这是一个有效的案例,您正在定义两个具有相同name
bean 的 bean 定义,然后定义的最后一个 bean 将替换然后定义的第一个 bean。
如果您想在两个 bean 以相同名称定义时引发异常,那么您可以使用setAllowBeanDefinitionOverriding(boolean allowBeanDefinitionOverriding)方法从DefaultListableBeanFactory
谁覆盖是否应该允许通过注册具有相同名称的不同定义来覆盖 bean 定义.
推荐阅读
- c++ - 如何在线程中初始化对象,然后在其他地方使用它?
- flutter - 我可以从我的应用(Flutter Android 和 IOS)直接拨打电话吗?
- python - 如何使用深度学习在 python jupyter notebook 中解决这个问题
- c++ - 使用结构初始化 std::array
- laravel - 使用 Eloquent 根据表 B 从表 A 中检索数据
- javascript - 提前退出 useEffect 挂钩导致“错误:重新渲染过多”
- wordpress - 为 Wordpress 多站点创建自定义注册表单
- javascript - JS for-loop + if-statement:在有条件地更新文本节点时捕获最后一次出现
- ubuntu - 使用 pyinstaller 创建二进制文件后 Okular 出现问题
- php - 如何在php中插入多个选择的值