是否可以将@StepScope与@Conditional和jobParameters一起使用?

时间:2016-09-16 14:11:21

标签: java spring spring-boot spring-batch

我正在尝试使用Spring Batch的@StepScope的@Conditional条件在条件中使用jobParameter,但在条件初始化期间,JobScope不活动 我试图确定是否设置了一个标志,并且只在设置了这个标志时实例化一个bean,否则应该实例化另一个相同接口的bean。

目前我正在尝试做类似

的事情
interface IInter {
    void bla();
}

@Component("A")
@Conditional(ACond.class)
@StepScope
class A implements IInter {

    @Override
    public void bla() {
        //... do something ....
    }
}

@Component("B")
@Conditional(BCond.class)
@StepScope
class B implements IInter {

    @Override
    public void bla() {
        //... do something else ...
    }
}

class ACond implements Condition {

    @Value("#{jobParameters[AProp]}")
    String jobPropA;

    @Value("#{jobParameters[BProp]}")
    String jobPropB;

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return !Utils.isEmpty(jobPropA) && Utils.isEmpty(jobPropB);
    }
}

class BCond implements Condition {

    @Value("#{jobParameters[AProp]}")
    String jobPropA;

    @Value("#{jobParameters[BProp]}")
    String jobPropB;

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return Utils.isEmpty(jobPropA) && !Utils.isEmpty(jobPropB);
    }
}

我尝试使用和不使用@StepScope的条件,但@Value值为null,因为它们在程序开始时被初始化。

也可以选择向我展示一种不同的方式,即只有在设置了作业参数时才能实现加载bean。

1 个答案:

答案 0 :(得分:1)

由于Conditional需要比执行作业更早可用,因此您提出的建议无法奏效。我建议写一个FactoryBean来处理这个用例。