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

时间:2017-05-24 11:44:48

标签: java spring dependency-injection

所以我有一个可以在几个不同国家启动的应用程序,例如: mvn clean package -Dcountry = FRANCE RESP。 mvn clean package -Dcountry = GERMANY

对于不同的国家/地区,我有不同的行为,尤其是在我验证内容时。

所以我有这个包含国家相关验证器的类:

@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");
       }
   }
}

我的问题是

  • 当应用程序启动时,如何“ - Dcountry = FRANCE” 如何设置将 MyCountrySpecificValidator1 的实例注入 SomeValidatingClass LI>

和resp。

  • 当应用程序以“开头”时,我如何设法将 MyCountrySpecificValidator2 的实例注入 SomeValidatingClass - Dcountry = GERMANY“

1 个答案:

答案 0 :(得分:4)

您可以使用@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注释

阅读here

更新:

更简单

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