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

Is it possible to use @StepScope together with @Conditional and jobParameters?

我正在尝试将 @Conditional 条件与 Spring Batch 的 @StepScope 一起使用,以在条件中使用 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 值为空,因为它们在程序开始时被初始化。

这也是一个选项,可以向我展示一种不同的方式,我可以如何实现仅在设置了作业参数时加载 bean。

您的建议将行不通,因为 Conditional 需要在作业执行之前可用。我建议写一个 FactoryBean 来处理这个用例。