在浏览javadoc of FacesContext
时,我遇到了这句话
实例保持活动状态,直到调用release()方法,之后不允许进一步引用此实例。当FacesContext实例处于活动状态时,除了执行此Web应用程序的servlet容器用于处理此请求的线程之外,不得从任何线程引用它。
这是否意味着FacesContext
永远不会进行垃圾收集,只有当current-webapplication停止(服务器停止)时才会销毁实例?
FacesContext
是否遵循单身模式?在这种情况下,当多个请求同时呈现响应时它将如何表现,因为它每次只提供一个请求?
答案 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
无关。