【问题标题】:Overriding spring beans with the same Qualifier Name覆盖具有相同限定符名称的 spring beans
【发布时间】:2020-12-10 02:44:08
【问题描述】:

我的 spring 应用程序中有 2 个配置类。 ConfigurationAnotherConfigurationAnotherConfiguration 的条件是仅在提供特定参数时才创建 bean(这由 ConditionalOnClass 注释处理)。

配置.java

@Configuration 
public class Configuration {

@Bean
    public Stage testStage() {
          return someStage1;
    }

@Bean
    public Stage testStage2() {
          return someStage2;
    }

}

另一个配置.java

@Configuration
@ConditionalOnClass()
public class AnotherConfiguration {

@Bean
    public Stage testStage2() {
          return newStage2;
    }

}

用例是,如果我提供满足AnotherConfiguration 的条件参数的参数,则应将newStage2 返回给所有期望testStage2 bean 的类。但目前,testStage2 bean 正在从 Configuration 类解析,而不是被 AnotherConfiguration 覆盖。

我已经尝试将@Primary 注释添加到AnotherConfiguration 的定义中,但这只是将newStage2 解析为所有期望Stage 类型的bean 的类,而与限定符无关。有没有办法指示 spring 仅覆盖相同 QualifierName 的 bean 定义(此处为 testStage2

由于项目限制,我无法对Configuration.java 进行更改,但可以对AnotherConfiguration.java 进行任何更改,保持名称 (testStage2()) 不变。

【问题讨论】:

  • 阅读this。 bean 覆盖是不好的,无法以任何方式确定。尝试解决它

标签: java spring spring-boot


【解决方案1】:

我真的不推荐,但是

使用条件而不是 onClass,因为如果没有参数,那将始终为真

public class Cond implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return false;
    }
}

然后定义要加载到上下文中的重写 bean

@Component("testStage2")
@Conditional(value = Cond.class)
@Primary
public class AnotherStage extends Stage {
    public AnotherStage(){
        //do whatever
    }
}

抱歉豆风格

@Configuration
public class AnotherConfiguration {
    @Bean("testBean2")
    @Conditional(value = Cond.class)
    @Primary
    public Stage testStage2() {
      return newStage2;
    }

}

【讨论】:

    猜你喜欢
    • 2020-06-07
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 2022-08-09
    • 2015-04-09
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多