首页 > 解决方案 > 为什么当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 会失败。

标签: springspring-boot

解决方案


这是一个有效的案例,您正在定义两个具有相同namebean 的 bean 定义,然后定义的最后一个 bean 将替换然后定义的第一个 bean。

如果您想在两个 bean 以相同名称定义时引发异常,那么您可以使用setAllowBeanDefinitionOverriding(boolean allowBeanDefinitionOverriding)方法从DefaultListableBeanFactory谁覆盖是否应该允许通过注册具有相同名称的不同定义来覆盖 bean 定义.


推荐阅读