java - 根据提供的环境属性注入(inject)不同的 bean

标签 java spring dependency-injection

所以我有一个应用程序可以在几个不同的国家启动,例如: mvn clean package -Dcountry=法国 分别 mvn clean package -Dcountry=德国

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

所以我有一个包含国家依赖 validator 的类:

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

第一个依赖于国家/地区的 validator :

public class MyCountrySpecificValidator1 implements Validator {
    @Override
    public void validate(Object target, Errors errors) {
        if (target == null) {
            errors.rejectValue("field", "some error code");
        }
    }
}

第二个依赖于国家/地区的 validator : 让我们假设

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 的实例注入(inject)到 SomeValidatingClass

和相应的

  • 当应用程序以 "-Dcountry=GERMANY" 启动时,我如何设法将 MyCountrySpecificValidator2 的实例注入(inject)到 SomeValidatingClass

最佳答案

您可以使用 @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 注释定义 Activity 配置文件

阅读here

更新:

更简单

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

关于java - 根据提供的环境属性注入(inject)不同的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44157476/

相关文章:

java - Surefire forkCount 不会产生这个数量的进程

java - 用于线程正确性的断言或注释

java - 将 jTable 选择导出到 Excel 并打开 Excel

javascript - Spring MVC使用ajax发送和接收参数

c# - 为什么无法解析来自程序集的类型 CaSTLe Windsor

java - java.io.FileOutputStream.write(int, boolean) native 方法的源代码

java - Linux 上 Spring MVC 图片上传和 ImageIO 转换失败

java - 如何引用 src/main/resources 文件夹中的 .wsdl 文件?

python - 有没有像 python 的通用依赖解析库这样的东西?

php - 我如何在 ZF2 的 Zend\ServiceManager 中使用 Zend\Di?