Java 根据提供的环境属性注入不同的bean

Java 根据提供的环境属性注入不同的bean,java,spring,dependency-injection,Java,Spring,Dependency Injection,因此,我有一个可以为几个不同国家启动的应用程序,例如: mvn清洁包装-D国家=法国 分别。 mvn清洁包装-D国家=德国 对于不同的国家,我有不同的行为,特别是当我验证东西时 所以我有一个类,它包含一个依赖于国家的验证器: @Component public class SomeValidatingClass { private final Validator myCountrySpecificValidator; @Autowired public SomeVal

因此,我有一个可以为几个不同国家启动的应用程序,例如: mvn清洁包装-D国家=法国 分别。 mvn清洁包装-D国家=德国

对于不同的国家,我有不同的行为,特别是当我验证东西时

所以我有一个类,它包含一个依赖于国家的验证器:

@Component
public class SomeValidatingClass {

    private final Validator myCountrySpecificValidator;

    @Autowired
    public SomeValidatingClass(MyCountrySpecificValidator myCountrySpecificValidator) {
        this.myCountrySpecificValidator = myCountrySpecificValidator;
    }

    public void doValidate(Object target, Errors errors) {
        myCountrySpecificValidator.validate(target, errors);
    }
}
public class MyCountrySpecificValidator1 implements Validator {
    @Override
    public void validate(Object target, Errors errors) {
        if (target == null) {
            errors.rejectValue("field", "some error code");
        }
    }
}
第一个依赖于国家/地区的验证器:

@Component
public class SomeValidatingClass {

    private final Validator myCountrySpecificValidator;

    @Autowired
    public SomeValidatingClass(MyCountrySpecificValidator myCountrySpecificValidator) {
        this.myCountrySpecificValidator = myCountrySpecificValidator;
    }

    public void doValidate(Object target, Errors errors) {
        myCountrySpecificValidator.validate(target, errors);
    }
}
public class MyCountrySpecificValidator1 implements Validator {
    @Override
    public void validate(Object target, Errors errors) {
        if (target == null) {
            errors.rejectValue("field", "some error code");
        }
    }
}
第二个依赖于国家/地区的验证器: 让我们假设

public class MyCountrySpecificValidator2 implements Validator {
   @Override
   public void validate(Object target, Errors errors) {
       if (target != null) {
           errors.rejectValue("field", "some other error code");
       }
   }
}
我的问题是

  • 当应用程序启动时,我如何将MyCountrySpecificValidator1的实例注入SomeValidatingClass
以及

  • 当应用程序启动时,我如何将MyCountrySpecificValidator2的实例注入SomeValidatingClass“-Dcountry=GERMANY”

您可以使用
@Conditional
注释根据条件提供实现。像这样

  @Bean(name="emailerService")
  @Conditional(WindowsCondition.class)
  public EmailService windowsEmailerService(){
      return new WindowsEmailService();
  }

  @Bean(name="emailerService")
  @Conditional(LinuxCondition.class)
  public EmailService linuxEmailerService(){
    return new LinuxEmailService();
  }
在哪里

public class LinuxCondition implements Condition{

  @Override
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    return context.getEnvironment().getProperty("os.name").contains("Linux");  }
}
你可以使用任何你需要的财产

如果需要多个bean,请使用
@Profile
注释定义活动概要文件

阅读

更新:

更简单

@ConditionalOnProperty(name = "country", havingValue = "GERMANY", matchIfMissing = true) and annotate a method which return the germany validator. And the same for France.

非常感谢,还有一个问题。如何注入名为“emailerService”的bean?自动布线在这里不起作用,对吗?我必须使用beans.xml或类似的东西吗?编辑:可能使用@resource实际上您只需要一个
SomeValidatingClass
bean。您可以定义使用
@Bean
@Conditional(FranceCondition.class)
注释的方法,该方法返回MyCountrySpecificValidator1,并标记为
@Conditional(GermanyCondition.class)
返回myCountrySpecificValidator2。用豆子就行了。(根据条件仅创建两个中的一个。