我使用Spring + JSF,View Scope由Spring管理。我注意到,在每个请求中,视图都被销毁并再次创建,因此每次请求都会调用任何@PostConstruct方法。
在大多数页面中都没问题,因为在该方法中只是一些对象初始化(主要是新调用)。
但是在其他页面中这是一个问题,因为我必须进行大量查询来初始化一些列表,并且视图行为会在每个请求上调用初始化方法...因此页面中的任何请求都是慢速的。
我知道视图范围将bean及其对象存储在会话中,然后将其恢复;所以我想知道是否有办法检查这些对象是否已经存储,所以我不需要在每次请求时初始化那些重物。从会议中获取它们。
更新
使用的视图范围是此处实现的范围:http://comdynamics.net/blog/109/spring3-jsf2-view-scope/
答案 0 :(得分:1)
您绝对应该将查询繁重的进程放入SessionScoped Bean。
然后,您可以使用@ManagedProperty
将ViewScoped bean中的引用用于SessionScopedBean此外,您可以更改html代码以直接引用sessionScoped bean属性。
如果在特定操作之后必须重置查询或树初始化(例如,当您删除或添加影响树的对象时),或者在访问页面后,您可以将初始化代码移动到&# 39,刷新'功能。无论如何,在ViewScoped或RequestScoped Beans的PostConstruct中避免繁重的初始化,查询和大型数据处理
答案 1 :(得分:1)
您需要将可在这些页面上重用的数据移动到会话范围的bean,并在其上放置一个方法,以便在必要时重新加载数据。然后从Session bean获取View范围bean的数据。通过这条路线,您只需要通过在会话bean上调用重新加载方法,在需要新数据时从数据库中检索数据。
我真的没有看到你问题的另一种解决方案。如果要将数据保留在视图范围之外,则需要会话范围的bean或单例。由于您不应将会话特定数据存储在单例bean中,因此您将使用会话bean。