首页 > 解决方案 > @ConditionalOnMissingBean 不能被覆盖

问题描述

我正在使用 Spring Boot 2.1.6.RELEASE,我想知道@ConditionalOnMissingBean应该如何使用?

示例配置:

@Configuration
public class MyAutoConfiguration {

  @Bean
  @ConditionalOnMissingBean
  public Foo foo() {
    return new Foo();
  }
}
@Configuration
@Import(MyAutoConfiguration.class)
public class AppConfiguration {

  @Bean
  public Foo foo() {
    return new Foo("some property");
  }
}

AppConfiguration.class并且MyAutoConfiguration.class在不同的模块中。

错误:

无法注册在类路径资源 [com/example/autoconf/configuration/AppConfiguration.class] 中定义的 bean 'foo'。已在类路径资源 [com/my/configuration/MyAutoConfiguration.class] 中定义了具有该名称的 bean,并且禁用了覆盖。

如何在@ConditionalOnMissingBean不设置spring.main.allow-bean-definition-overriding=true属性的情况下使用?

标签: spring-boot

解决方案


为了MyAutoConfiguration被 Spring Boot 拾取为自动配置,它需要如下META-INF/spring.factories声明

org.springframework.boot.autoconfigure.EnableAutoConfiguration=x.y.z.MyAutoConfiguration 

有关自定义自动配置的更多详细信息,请查看此处


推荐阅读