@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.class
和 MyAutoConfiguration.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有什么区别