在经历javadoc 的FacesContext,我看到这句话
该实例保持活动状态,直到调用其release()方法为止,之后不允许进一步引用该实例。当 FacesContext 实例处于活动状态时,除了执行此 Web 应用程序的 Servlet 容器用于处理此请求的线程之外,不得从任何线程引用它
这是否意味着FacesContext
永远不会进行垃圾收集,并且只有当当前Web应用程序停止(服务器停止)时实例才会被销毁?
Is FacesContext
遵循单例模式?在这种情况下,当多个请求同时进行渲染响应时,它会如何表现,因为它每次只服务一个请求?
这是否意味着FacesContext
永远不会进行垃圾收集,并且只有当当前Web应用程序停止(服务器停止)时实例才会被销毁?
不,你读错了。这FacesContext
与单个 HTTP 请求一样长。如果您在任何地方错误地引用它,它(实际上,“可以”是一个更好的词)不会立即被 GC 处理。your own代码超出其范围。例如。作为会话范围托管 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();
}
如果你没有在代码中的任何地方这样做,那么你就是always获取方法本地范围内的当前实例,那么它将有机会被正确的GC'ed。
@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。
Is FacesContext
遵循单例模式?在这种情况下,当多个请求同时进行渲染响应时,它会如何表现,因为它每次只服务一个请求?
不,这绝对不是单身人士。它是ThreadLocal创建的实例FacesServlet
就在之后service()
方法被输入并销毁FacesServlet
就在之前service()
方法就剩下了。因此,只有一个实例根据要求(因此不是每个应用程序)。请注意,一个 HTTP 请求算作一个单独的线程。可以有多个线程(读取:请求),因此可以有多个实例FacesContext
在应用程序的生命周期内。其主要图案是立面图案,但这与它是一个无关ThreadLocal
.
也可以看看:
- java threadlocal singleton - 它是什么?
- 如何在servlet环境中初始化API
- Java 核心库中 GoF 设计模式的示例
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)