如何通过varargs程序参数有条件排除Spring bean?

问题描述

如何让spring评估varargs并有条件地运行bean?

@SpringBootConfiguration
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class);
  }
}

@Service
@Order(1) //run if no vararg is given
public class Job1 implements ApplicationRunner {
}

@Service
@Order(2) //Todo run only if a "job2" occurs as vararg
public class Job2 implements ApplicationRunner {
}

问题:我想通过在应用程序启动时从命令行给出的varargs有条件地启动这些作业。有可能吗?

解决方法

您如何在这些bean上使用.loc[1],并通过属性从命令行包含/排除它们呢?

完整的示例可能是:

dfmap.loc[X,col]

然后使用以下属性传递属性:

@ConditionalOnProperty

另一种选择是从Job1 / Job2类中删除@ Component / @ Service,并在配置类中创建类似于以下内容的Bean:

@Service
@Order(1) //run if no vararg is given
@ConditionalOnProperty(name = "my.property",havingValue = "job1")
public class Job1 implements ApplicationRunner {
}

@Service
@Order(2) //TODO run only if a "job2" occurs as vararg
@ConditionalOnProperty(name = "my.property",havingValue = "job2")
public class Job2 implements ApplicationRunner {
}
,

可以通过简单地实现自定义Condition并评估ApplicationArguments来实现。我正在寻找的参数在Spring之前称为非可选args

class Job2Condition implements Condition {
    @Override
    public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata) {
        return context.getBeanFactory()
                .getBean(ApplicationArguments.class)
                .getNonOptionArgs()
                .contains("job2");
    }
}

@Component
@Conditional(Job2Condition.class)
public class Job2 implements ApplicationRunner {
}