FacesContext的生命周期?

Ull*_*las 7 thread-safety facescontext jsf-2

在经历javadoc时FacesContext,我偶然发现了这句话

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

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

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

Bal*_*usC 11

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

不,你读错了.在FacesContext生活中,只要一个HTTP请求.它(实际上,"可以"是一个更好的词)如果你错误地在你自己的代码中的任何地方引用它超出其范围,它将不会立即被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();

}
Run Code Online (Sandbox Code Playgroud)

如果你没有在你的代码中的任何地方这样做,因此你总是在方法局部范围内获得当前实例,那么它将有机会正确地进行GC.

@ManagedBean
@SessionScoped
public class GoodSessionBean {

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

}
Run Code Online (Sandbox Code Playgroud)

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


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

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

也可以看看: