我有一个@ApplicationScoped
bean,我创建了一堆实例。然后,我使用这些实例创建一个包含实例中包含的数据的JSF页面。我希望用户能够修改这些数据(仅供他们使用,不存储),但不会影响共享同一bean访问权限的其他用户的视图。我正在考虑为每个新会话创建一个@SessionScoped
版本的@ApplicationScoped
bean,但我不确定最好的方法是什么。我应该:
扩展@ApplicationScoped
bean并给它@SessionScoped
,然后在我的构造函数中,获取所有的relvant数据?
不创建@SessionScoped
版本,而是为用户可以在@ApplicationScoped
bean中修改的每个数据创建“用户”版本?
其他想法?
答案 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。
此致