Spring中无论SampleBean是否存在都创建SomeClass Bean的配置问题
问题分析与解决方案
问题根源
现有配置中第二个SomeClass Bean的条件注解存在逻辑矛盾:
@ConditionalOnBean(SomeClass.class)要求容器中已存在SomeClassBean才创建当前Bean@ConditionalOnMissingBean("someClass")又要求容器中不存在SomeClassBean才创建
这两个条件互斥,导致当SampleBean不存在(第一个SomeClassBean未创建)时,第二个Bean也无法满足条件被创建,最终容器中没有SomeClassBean,引发找不到Bean的异常。
修复方案
修改ConfigClass中第二个SomeClass Bean的条件注解,移除矛盾的@ConditionalOnBean(SomeClass.class),仅保留@ConditionalOnMissingBean,确保当第一个SomeClass Bean未创建时,自动生成无SampleBean依赖的版本。
同时简化第一个Bean的条件注解(Builder Bean必然存在,无需加入条件判断),优化后的代码如下:
public class ConfigClass { // 创建builder实例 @Bean public Builder builder() { return new Builder(); } // 当SampleBean存在时,创建带SampleBean的SomeClass @Bean @ConditionalOnBean(SampleBean.class) public SomeClass someClass(Builder builder, SampleBean sampleBean) { builder.set(sampleBean); return builder.getSomeClass(); } // 当容器中无SomeClass实例时,创建不带SampleBean的版本 @Bean @ConditionalOnMissingBean(SomeClass.class) public SomeClass someClass(Builder builder) { return builder.getSomeClass(); } }
逻辑说明
- 第一个
SomeClassBean:仅在SampleBean存在时触发创建,自动注入已有的Builder和SampleBean完成初始化 - 第二个
SomeClassBean:仅在容器中还没有SomeClass实例时触发,刚好覆盖SampleBean不存在的场景 - 两个Bean可使用相同方法名,Spring会根据条件自动选择创建逻辑,不会产生冲突
内容的提问来源于stack exchange,提问作者unknown
相关产品推荐
相关产品推荐

