是否可以将@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
来处理这个用例。
我正在尝试将 @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
来处理这个用例。