You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中无论SampleBean是否存在都创建SomeClass Bean的配置问题

问题分析与解决方案

问题根源

现有配置中第二个SomeClass Bean的条件注解存在逻辑矛盾:

  • @ConditionalOnBean(SomeClass.class)要求容器中已存在SomeClass Bean才创建当前Bean
  • @ConditionalOnMissingBean("someClass")又要求容器中不存在SomeClass Bean才创建
    这两个条件互斥,导致当SampleBean不存在(第一个SomeClass Bean未创建)时,第二个Bean也无法满足条件被创建,最终容器中没有SomeClass Bean,引发找不到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();
    }
}

逻辑说明

  1. 第一个SomeClass Bean:仅在SampleBean存在时触发创建,自动注入已有的Builder和SampleBean完成初始化
  2. 第二个SomeClass Bean:仅在容器中还没有SomeClass实例时触发,刚好覆盖SampleBean不存在的场景
  3. 两个Bean可使用相同方法名,Spring会根据条件自动选择创建逻辑,不会产生冲突

内容的提问来源于stack exchange,提问作者unknown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:43:26