@ConditionalOnMissingBean 不能被覆盖

Posted

技术标签:

【中文标题】@ConditionalOnMissingBean 不能被覆盖【英文标题】:@ConditionalOnMissingBean can not be overridden 【发布时间】:2019-12-04 15:49:36 【问题描述】:

我正在使用 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.classMyAutoConfiguration.class 在不同的模块中。

错误:

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

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

【问题讨论】:

【参考方案1】:

要让 Spring Boot 将 MyAutoConfiguration 拾取为自动配置,它需要在 META-INF/spring.factories 中声明,如下所示

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

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

【讨论】:

我不需要它是“自动配置”并且在没有明确 @Import 的情况下拾取。相反,我不希望它被引导启动,除非我使用@Import。但是,尽管如此,我尝试添加 factories 文件,但我得到了相同的行为。 我还没有删除@Import。与factories 一起工作正常。仍然想知道如何使用@Import 进行显式设置。 @Import 将类视为普通配置而不是自动配置。要使@ConditionalOnMissingBean 工作,该类需要注册为自动配置。因此观察到的行为。 @Import通过自动配置实现时需要/首选@Import的任何特殊原因,它更干净且符合约定优于配置的spring boot原则? 只因为@Import 可以看到使用了哪些自定义配置。

以上是关于@ConditionalOnMissingBean 不能被覆盖的主要内容,如果未能解决你的问题,请参考以下文章

Spring@ConditionalOnBean和@ConditionalOnMissingBean有什么区别

Spring@ConditionalOnBean和@ConditionalOnMissingBean有什么区别

Spring@ConditionalOnBean和@ConditionalOnMissingBean有什么区别

SpringBoot总结

@Conditional派生注解

springboot公开课随笔