首页 > 解决方案 > Spring singleton bean 的值与用户共享

问题描述

我有一个具有以下 bean 的 Spring webapp。当 2 个用户同时进入系统时,两个用户都获得相同的服务,而它应该显示每个用户自己的服务。不应该混淆。

如何在当前代码中执行此操作?CommonWSServiceClass 默认是单例范围。

  1. 我可以删除实例字段private List<Services> exSVCList = null;并使其成为本地方法(在retrieveExistingService() 方法中声明它)。通过这种方式,我相信它在某种程度上解决了这个问题。但请参阅下面的问题。

  2. 将上述变量设置为方法本地后,如果两个用户同时来会发生什么。两个线程都在方法retrieveExistingService() 中,但user_1return exSVCList;在线。正要退出该方法。但是 user_2 来执行相同的方法 line exSVCList = new ArrayList();。所以在这种情况下,当 user_1 完成方法retrieveExistingService() 的执行时,他会得到一个空的arrayList,不是吗?由于 bean 是单例的,因此那里只有一个 bean。所以arraylist的大小是空的。因为 user_2 更新了相同的变量。

我的理解正确吗?如果是这种情况,如何在 Spring 中处理这个问题?

    @Component
    @Scope(value = "session")
    public class ServiceClass {

       @Autowired
       private CommonWSServiceClass webservices;

       public services[] getExServices(){             
          List<Services> list =  webservices.retrieveExistingService()
       }
    }

 
    @Service
    public class CommonWSServiceClass {

      private List<Services> exSVCList = null;

      public List<Services> retrieveExistingService() {
        
        exSVCList = new ArrayList();
        exSVCList.add(addSomeObj);

        updateList();
    
        exSVCList.add(addAnotherObj);

        return exSVCList;

     }

     private void updateList() {        
       exSVCList.add(Call a Webservice to get the item list.);    
     }

   }

标签: springspring-bootspring-mvc

解决方案


单例必须是无状态的,因此删除状态(私有列表 exSVCList = null)并将其定义为方法变量。如果您需要存储每个连接用户的状态,它应该作为属性进入其会话


推荐阅读