Spring 当默认设置不允许时,bean 覆盖不会抛出异常

Spring bean overriding does not throw exception when default settings is not allowing

我有以下配置 class。

@Configuration
public class BeanConfig {

    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper();
    }
}

我正在创建对象映射器 (Jackson) bean 以用作模型映射器,但我相信 Spring 必须抛出 BeanDefinitionOverrideException,因为我正在覆盖 ObjectMapper。我知道在 Spring Boot 2.1 之后的这种情况下会添加并抛出此异常,并且我正在使用 2.4.x 版本。

spring.main.allow-bean-definition-overriding=false // default config

我想知道为什么我没有得到这样的异常?

由于spring-boot提供的默认ObjectMapperbean配置中的@ConditionalOnMissingBean,如果你不定义它只会定义和配置一个默认的ObjectMapperbean自己一个人。

现在,当您定义 ObjectMapper 时,它会导致 spring-boot 停止定义默认值。所以最后你只有一个 ObjectMapper bean,因此 BeanDefinitionOverrideException 不会发生。

如果您创建另一个 @Configuration 并再定义一个同名的 ObjectMapper,您应该生成 BeanDefinitionOverrideException :

@Configuration
@Import(BeanConfig2.class)
public class BeanConfig {

    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper();
    }
}

@Configuration
public class BeanConfig2 {

    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper();
    }
}