2016-09-16 50 views
0

我试图使用条件与Spring批处理@StepScope使用条件中的jobParameter,但在条件初始化时,JobScope不活动 我试图确定是否设置标志,并只实例化一个bean当这个标志被设置时,否则应该实例化相同接口的另一个bean。是否可以将@StepScope与@Conditional和jobParameters一起使用?

目前,我试图做类似

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值是零,因为他们可以在程序的开始intitialized。

这也是一个选项,让我看到一种不同的方式,只有在设置了jobparameter时才能加载bean。

回答

1

由于Conditional需要比执行作业更早可用,因此您提议的内容不起作用。我建议编写一个FactoryBean来处理这个用例。

相关问题