FacesContext的生命周期?

时间:2013-04-26 06:16:12

标签: jsf-2 thread-safety facescontext

在浏览javadoc of FacesContext时,我遇到了这句话

  

实例保持活动状态,直到调用release()方法,之后不允许进一步引用此实例。当FacesContext实例处于活动状态时,除了执行此Web应用程序的servlet容器用于处理此请求的线程之外,不得从任何线程引用它。

这是否意味着FacesContext永远不会进行垃圾收集,只有当current-webapplication停止(服务器停止)时才会销毁实例?

FacesContext是否遵循单身模式?在这种情况下,当多个请求同时呈现响应时它将如何表现,因为它每次只提供一个请求?

1 个答案:

答案 0 :(得分:10)

  

这是否意味着FacesContext永远不会进行垃圾收集,只有当current-webapplication停止(服务器停止)时才会销毁实例?

不,你读错了。只要一个HTTP请求,FacesContext就会存在。它(实际上,“可以”是一个更好的词)如果你错误地在你自己的代码中的任何地方引用它,那么它就不会立即被GC引用。例如。作为会话作用域托管bean的一个属性,它比一个HTTP请求的生命周期更长:

@ManagedBean
@SessionScoped
public class BadSessionBean {

    // Bad Example! Never do this! Not threadsafe and instance can't be GC'ed by end of request!
    private FacesContext context = FacesContext.getCurrentInstance();

}

如果您没有在代码中的任何位置执行此操作,因此您总是在方法本地范围内获取当前实例,那么它将有机会正确地进行GC操作。

@ManagedBean
@SessionScoped
public class GoodSessionBean {

    public void someMethod() {
        // OK! Declared in method local scope and thus threadsafe.
        FacesContext context = FacesContext.getCurrentInstance();
    }

}

请注意,此GC行为并非特定于JSF / FacesContext,它仅适用于基本Java。


  

{@ 1}}是否遵循单身模式?在这种情况下,当多个请求同时呈现响应时它将如何表现,因为它每次只提供一个请求?

不,这绝对不是单身人士。它是FacesContext实例,在FacesServlet方法输入后立即由service()创建,并在FacesServlet方法离开前由service()销毁。因此,每个请求只有一个实例 (因此不是每个应用程序)。请注意,一个HTTP请求计为一个单独的线程。可以有多个线程(读取:请求),因此在应用程序的生命周期中可能有多个FacesContext实例。它的主要模式是ThreadLocal,但这与ThreadLocal无关。

另见: