考虑这个例子
@Scope(ScopeType.SESSION)
@Name("test")
@BypassInterceptors
public Class Test {
@Unwrap
public List<String> test() {
//do a long and major calculation and return the List
}
}
然后你有了一个视图并且你得到了你的列表
<h:selectOneMenu value="#{someBean.text}">
<s:selectItems value="#{test}"/>
</h:selectOneMenu>
现在在我看来,因为我有Scope会话,列表应该被缓存,或者 Seam manager组件至少,所以它会运行一次,但是当你重新访问页面时同一个会话,它不应该再次运行,但是当我重新进入页面时,再次运行Unwrap方法。
所以我的问题是,Session范围和事件范围之间有什么区别?
为了避免这种情况,我在会话上下文中手动缓存了列表,如果@Unwrap
方法中存在
答案 0 :(得分:2)
好像我误解了Manager组件。
如果要在访问对象之前执行操作,@Unwrap
非常有用。例如SMPC使用@Unwrap
来确保它每次都加入了交易。
实际上是适合我需要的@Factory
注释,它会超出返回值。
因此,组件的范围仍然是正常的Seam组件范围。当然,在那个确切的例子中,它没那么有用,因为没有字段。
答案 1 :(得分:2)
@Unwrap与@Factory不同,因为每次请求时都会对其进行评估。如果您有一个需要当前时间的页面,此页面请求当前日期三次,如下所示
#{currentDate}
#{currentDate}
#{currentDate}
因为封装currentDate的组件定义了@Unwrap方法,所以它被评估三次
如果你有@Factory,只评估一次
#{compon.someFactory}
#{compon.someFactory}
#{compon.someFactory}