Spring3托管JSF应用程序中会话bean、代理和单例的作用域混淆

Spring3托管JSF应用程序中会话bean、代理和单例的作用域混淆,spring,jsf,spring-mvc,javabeans,scopes,Spring,Jsf,Spring Mvc,Javabeans,Scopes,这似乎是Spring101的基本功能,但我似乎找不到正确的方法。情况如下,;在我的web应用程序中,有一个单一的入口点,它是一个控制器,用于处理来自外部系统的用户。传输只是一个POST请求,包含一组与该用户相关的信息。Apon条目,我需要创建一个新的用户bean,并用该用户信息加载它。此外,当用户点击触发某个服务的视图时,我需要该服务能够访问适当的用户bean实例 想到的第一种方法是使用UserManager服务,它将创建一个新的User实例,用数据填充它,然后在Spring容器中以用户名作为b

这似乎是Spring101的基本功能,但我似乎找不到正确的方法。情况如下,;在我的web应用程序中,有一个单一的入口点,它是一个控制器,用于处理来自外部系统的用户。传输只是一个POST请求,包含一组与该用户相关的信息。Apon条目,我需要创建一个新的用户bean,并用该用户信息加载它。此外,当用户点击触发某个服务的视图时,我需要该服务能够访问适当的用户bean实例

想到的第一种方法是使用UserManager服务,它将创建一个新的User实例,用数据填充它,然后在Spring容器中以用户名作为bean名称注册它。然后,当调用服务时,该服务将执行类似于Factory.getBeanusername的操作来查找适当的用户实例。我在这里看到的问题是,我正在丢失用户之间的链接&哪个用户bean属于他们。此外,我希望尽可能避免让用户在会话中携带bean。这就是我应该使用Spring AOP和代理的地方吗


解决这种情况的典型Spring模式是什么?

因此,自从提出这个问题以来,已经过去了好几个星期,因此我的知识水平呈指数级增长,因此,我想我不妨为任何人回答我的问题,他们可能会觉得这很有帮助,更不用说这个问题一开始就不是很清楚

基本答案是:使用代理。因为一个单例只实例化一次,所以不能注入另一个生命周期较短的类,例如会话范围。对于那些需要更多信息的人,请检查有状态bean与无状态bean。或多或少我最后做的是。。。服务包含用于操作数据的无状态代码;RegisterUserSvc、AddPartSvc等。这些服务操作的数据是有状态的。例如,每个用户都有自己的数据对象的副本,比如TodoListBean,每个用户的状态都不同

那么一个服务,比如AddTodoItemService,是如何操作这些数据的呢?这就是代理发挥作用的地方。实例化时,AddTodoItemService会被注入TodoListBean的代理,而不是实际对象。这样,当服务需要访问TodoListBean时,容器将从当前用户会话中提供TodoListBean,因此服务将在用户调用服务的正确bean上运行,而不是做一些愚蠢的事情,比如在每个用户会话范围中包含多个服务副本