Scope在Unwrap(Manager)组件上有什么意义

时间:2010-10-26 08:54:01

标签: seam

考虑这个例子

@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方法中存在

,则从上下文中检索它

2 个答案:

答案 0 :(得分:2)

好像我误解了Manager组件。

如果要在访问对象之前执行操作,@Unwrap非常有用。例如SMPC使用@Unwrap来确保它每次都加入了交易。

实际上是适合我需要的@Factory注释,它会超出返回值。

因此,组件的范围仍然是正常的Seam组件范围。当然,在那个确切的例子中,它没那么有用,因为没有字段。

答案 1 :(得分:2)

@Unwrap与@Factory不同,因为每次请求时都会对其进行评估。如果您有一个需要当前时间的页面,此页面请求当前日期三次,如下所示

#{currentDate}

#{currentDate}

#{currentDate}

因为封装currentDate的组件定义了@Unwrap方法,所以它被评估三次

如果你有@Factory,只评估一次

#{compon.someFactory}

#{compon.someFactory}

#{compon.someFactory}