0

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

想到的第一种方法是创建一个 UserManager 服务,该服务将创建一个新的 User 实例,用数据填充它,然后将其注册到 Spring 容器中,并将用户名作为 bean 名称。然后当一个服务被调用时,该服务会做一些事情,比如Factory.getBean(username)找到合适的User实例。我在这里看到的问题是我失去了用户和哪个Userbean 属于他们之间的链接。此外,如果可能的话,我想避免让用户在会话中随身携带 bean。这是我应该使用 Spring AOP 和代理的地方吗?

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

4

1 回答 1

0

所以现在是很多周后(自从提出这个问题以来),因此我的知识水平呈指数级增长,所以我想我不妨为任何可能觉得它有帮助的人回答我的问题(更不用说这个问题不是一开始就很清楚)。

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

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

于 2011-04-22T00:19:45.003 回答