创建ApplicationScoped bean的SessionScoped版本

时间:2013-12-05 20:21:27

标签: jsf jsf-2

我有一个@ApplicationScoped bean,我创建了一堆实例。然后,我使用这些实例创建一个包含实例中包含的数据的JSF页面。我希望用户能够修改这些数据(仅供他们使用,不存储),但不会影响共享同一bean访问权限的其他用户的视图。我正在考虑为每个新会话创建一个@SessionScoped版本的@ApplicationScoped bean,但我不确定最好的方法是什么。我应该:

  1. 扩展@ApplicationScoped bean并给它@SessionScoped,然后在我的构造函数中,获取所有的relvant数据?

  2. 不创建@SessionScoped版本,而是为用户可以在@ApplicationScoped bean中修改的每个数据创建“用户”版本?

  3. 其他想法?

2 个答案:

答案 0 :(得分:2)

  

我有一个@ApplicationScoped bean,我创建了一堆实例   的。

这是错误的,@ApplicationScoped bean的真正目的是最小化JVM堆内存中的数据冗余。任何时候都应该只有一个实例,任何其他作用域bean都可以访问一个实例。正如上面的Luiggi Mendoza所建议的那样,根据您的使用情况,您可以使用@SessionScoped@ViewScoped bean。

但简单地说,如果数据不会被共享或持久化,则永远不要使用@ApplicationScoped bean。

答案 1 :(得分:1)

我真的建议您阅读其他问题以改进您的架构设计:Understanding JSF as a MVC framework

似乎你已经开始在错误的意义上编码了。在开发的设计阶段,您应该首先考虑应用程序需要的@sessionscoped bean(根据用户需求考虑)。然后,你应该关注@applicationscoped bean(就像你的全局应用程序需求)。

构建一个@sessionscoped bean从@applicationscoped bean扩展它真的很奇怪。

如你所说,你应该写一个包含所有必要数据的@sessionscoped,并用相关数据对其进行初始化。您仍然可以访问@applicationscoped方法。无论如何,尽量减少对@apllicationscoped bean的访问,尽可能将代码编入@sessionscoped bean。

此致