我正在尝试使用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。
答案 0 :(得分:1)
由于Conditional
需要比执行作业更早可用,因此您提出的建议无法奏效。我建议写一个FactoryBean
来处理这个用例。