首页 > 解决方案 > 如何在 Spring 批处理应用程序中创建 List OR ArrayList 对象单例。java - 如何在java spring batch/boot中将字段注释为单例

问题描述

我正在编写一个 Spring 批处理应用程序,其中有块/任务来处理多个记录。如果我有 100 条记录要处理,则执行多个块来处理所有记录。假设在第一个块/任务中,前 25 条记录存储在 ArrayList 中并进行处理,下一个块/任务执行以存储和处理接下来的 25 条记录,依此类推。

我想以这样的方式设计 ArrayList ,它应该存储来自当前块/任务的记录以及先前执行的块/任务的记录,而不是每次为执行的每个 Batch 步骤创建新对象。对于这种情况,我需要将 ArrayList 设为单例对象,这样只有一个 ArrayList 实例存在,并且我可以拥有以前的记录,也可以存储来自当前块/任务的新记录。

我曾尝试使用Collection::singletonList()但它返回不可变而不是“Singleton”对象。我也尝试使用诸如@Scope之类的注释,但它给出了编译错误 - “'@Scope' 不适用于字段”

解决这个问题的可能方法是什么?对于这个 UseCase ,我创建单例列表的方法是否正确?

标签: javaspring-bootcollectionssingletonspring-batch

解决方案


Static-Final 无济于事,因为静态将为 2 个任务加载两次类,并且每次加载类时都会创建 List 的实例。但我找到了解决方案,这对我有用:我创建了一个 bean,它将返回列表对象,并在我想要访问该 bean 的类中按名称自动连接,这样每次它都会返回相同的实例数组列表

例子:

    Class MyList
    {
      @Bean
      public List getMyListInst()
      {
        return new ArrayList();
      }
    }

//下面的类,我们要使用上面的列表

    class UserClass
    {
       @Autowire
       private List getMyListInst; // Use the same name as given in above Bean

       ....
       ....

    }

推荐阅读