首页 > 解决方案 > 覆盖具有相同限定符名称的 spring beans

问题描述

我的 spring 应用程序中有 2 个配置类。 ConfigurationAnotherConfiguration。仅当提供了某个参数(这AnotherConfigurationConditionalOnClass注释处理)时才创建 bean。

配置.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;
    }

}

用例是,如果我提供一个满足 Conditional 参数的参数AnotherConfigurationnewStage2则应该将其返回给所有期望testStage2bean 的类。但是目前,testStage2bean 是从Configuration类中解析出来的,而不是被AnotherConfiguration.

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

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

标签: javaspringspring-boot

解决方案


我真的不推荐它但是

使用条件而不是 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;
    }

}

推荐阅读