Java spring批处理:作用域(“步骤”)失败

Java spring批处理:作用域(“步骤”)失败,java,spring,Java,Spring,我可以在xml配置中使用scope=“step”而不会出现任何问题,但如果使用它作为注释,如下所示 . 它抛出以下错误 原因:org.springframework.beans.factory.unsatifiedpendencyException:创建名为“step1”的bean时出错,该bean在类路径资源[BatchConfiguration.class]中定义:未满足的依赖项通过构造函数参数表示,索引1的类型为[org.springframework.batch.item.ItemRea

我可以在xml配置中使用scope=“step”而不会出现任何问题,但如果使用它作为注释,如下所示 . 它抛出以下错误

原因:org.springframework.beans.factory.unsatifiedpendencyException:创建名为“step1”的bean时出错,该bean在类路径资源[BatchConfiguration.class]中定义:未满足的依赖项通过构造函数参数表示,索引1的类型为[org.springframework.batch.item.ItemReader]::创建名为“reader”的bean时出错:作用域“step”对于当前线程不是活动的;如果您想从一个单体引用它,请考虑为这个bean定义一个作用域代理;嵌套的异常是java.lang.IllegalStateException:没有可用于步骤范围的上下文持有者;嵌套异常为org.springframework.beans.factory.BeanCreationException:创建名为“reader”的bean时出错:当前线程的作用域“步骤”未处于活动状态;如果您想从一个单体引用它,请考虑为这个bean定义一个作用域代理;嵌套异常为java.lang.IllegalStateException:没有可用于步骤范围的上下文持有者

要点是:

作用域“步骤”对于当前线程不处于活动状态

根本原因是什么

public class BatchConfiguration {

    @Bean
    @Scope("step")
    public ItemReader<Source> reader(@Value("#{jobParameters['fileName']}") String fileName) {
        System.out.println("*****************************");
        System.out.println("read file of "+fileName);
        System.out.println("*****************************");
        FlatFileItemReader<Source> reader = new FlatFileItemReader<Source>();

        reader.setResource(new FileSystemResource(fileName));
        reader.setLineMapper(new DefaultLineMapper<Source>() {{
            setLineTokenizer(new DelimitedLineTokenizer() {{
                setNames(new String[] { "firstName", "lastName" });
            }});
            setFieldSetMapper(new BeanWrapperFieldSetMapper<Source>() {{
                setTargetType(Source.class);
            }});
        }});
        return reader;
    }
公共类批处理配置{
@豆子
@范围(“步骤”)
公共项目阅读器(@Value(“#{jobParameters['fileName']}”)字符串文件名){
System.out.println(“*************************************”);
System.out.println(“读取文件”+文件名);
System.out.println(“*************************************”);
FlatFileItemReader=新的FlatFileItemReader();
setResource(新文件系统资源(文件名));
reader.setLineMapper(新的DefaultLineMapper(){{
setLineTokenizer(新的DelimitedLineTokenizer(){{
setNames(新字符串[]{“firstName”,“lastName”});
}});
setFieldSetMapper(新的BeanRapperFieldSetMapper(){{
setTargetType(Source.class);
}});
}});
返回读取器;
}

您需要使用以下两种方法之一

   @Scope(value="step",
   proxyMode=TARGET_CLASS)


我不理解@Scope(“step”)和@StepScope之间的区别,尽管它解决了我的问题。请您解释一下它们之间的区别好吗?如果您检查一下实现,
@StepScope
相当于
@Scope(value=“step”,proxyMode=ScopedProxyMode.TARGET\u CLASS)
 @Bean
 @StepScope