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提供的默认ObjectMapper
bean配置中的@ConditionalOnMissingBean
,如果你不定义它只会定义和配置一个默认的ObjectMapper
bean自己一个人。
现在,当您定义 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();
}
}
我有以下配置 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提供的默认ObjectMapper
bean配置中的@ConditionalOnMissingBean
,如果你不定义它只会定义和配置一个默认的ObjectMapper
bean自己一个人。
现在,当您定义 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();
}
}