代码之家  ›  专栏  ›  技术社区  ›  Shervin Asgari

Unwrap(Manager)组件的作用域是什么

  •  2
  • Shervin Asgari  · 技术社区  · 14 年前

    考虑这个例子

    @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>
    

    现在在我看来,因为我有作用域会话,所以应该缓存列表,或者 Seam管理器组件 至少,这样它将运行一次,但是当您在同一会话中重新访问该页时,它不应该再次运行,但是当我重新输入该页时,Unwrap方法将再次运行。

    所以我的问题是,会话作用域和say事件作用域有什么区别?

    为了避免这种情况,我已经在会话上下文中手动缓存了列表,并从上下文中检索它(如果它存在于 @Unwrap 方法

    2 回复  |  直到 14 年前
        1
  •  2
  •   Shervin Asgari    14 年前

    似乎我误解了经理这个部分。

    这个 @Unwrap @展开

    实际上是 @Factory 适合我的需要的注释,这将使返回值丢失。

    因此,组件的作用域仍然有效,与普通Seam组件作用域相同。当然,在这个确切的例子中,它没有那么有用,因为没有字段。

        2
  •  2
  •   Shervin Asgari    14 年前

    @Unwrap不同于@Factory,因为 每次请求时都会对其进行评估

    #{currentDate}
    
    #{currentDate}
    
    #{currentDate}
    

    因为封装currentDate的组件定义了一个@Unwrap方法,所以它被计算三次

    如果你有工厂, 只评估一次

    #{compon.someFactory}
    
    #{compon.someFactory}
    
    #{compon.someFactory}