这似乎是Spring 101的基本内容,但我似乎无法找到正确的方法来做到这一点。情况如下;在我的Web应用程序中,有一个入口点是一个控制器,用于处理来自外部系统的用户。传输只是一个POST
请求,其中包含一系列与该用户相关的信息。在Apon条目中,我需要创建一个新的User bean并使用该用户信息加载它。此外,当用户点击触发某些服务的视图时,我需要该服务能够访问相应的User bean实例。
首先想到的方法是创建一个UserManager服务,该服务将创建一个User的新实例,用数据填充它,然后在用户名作为bean名称的Spring容器中注册它。然后,当调用服务时,服务会执行Factory.getBean(username)
之类的操作来查找相应的User
实例。我在这里看到的问题是我失去了用户与用户之间的联系。哪个User
bean属于他们。另外,如果可能的话,我想避免让用户在会话中携带bean。这是我应该使用Spring AOP&代理?
解决此类情况的典型Spring模式是什么?
答案 0 :(得分:0)
所以现在好几周之后(自问这个问题以来),因此我的知识水平呈指数级增长,所以我想我也可以回答我的问题给任何可能觉得有帮助的人(更不用提问题了)开始并不是很清楚)。
基本答案是:使用代理。由于单例只是实例化1次,你不能注入另一个寿命较短的类,例如。会话范围。对于那些需要更多信息的人,请检查有状态与无状态bean。或多或少我最终做的是......服务包含用于操作数据的STATELESS代码(思考动词; RegisterUserSvc,AddPartSvc等)。这些服务操纵的数据是有状态的。例如,每个用户都拥有自己的数据对象的副本,比如说TodoListBean,它对每个用户都处于不同的状态。
那么,例如AddTodoItemService服务如何操纵这些数据呢?这是代理发挥作用的地方。实例化时,AddTodoItemService将注入TodoListBean的代理,而不是实际对象。这样,当服务需要访问TodoListBean时,容器将从当前用户会话中提供TodoListBean,因此服务将在正确的bean上运行(基于哪个用户调用了服务),而不是做某事愚蠢的是,每个用户会话范围中包含许多服务副本。