莫哈拉 2.2.12
这是接管 FacesContext 实例化的一段代码:
FacesContext context = facesContextFactory.getFacesContext
(servletConfig.getServletContext(), request, response, lifecycle);
表达是完全清楚的。一旦我们收到请求,我们就会从中获取全局信息并创建
FacesContext
使用它的实例。因此,实例是为每个请求创建的。但是获取facesContextFactory
的实例在我看来要棘手得多。// Acquire our FacesContextFactory instance
try {
facesContextFactory = (FacesContextFactory)
FactoryFinder.getFactory
(FactoryFinder.FACES_CONTEXT_FACTORY);
} catch (FacesException e) {
//others
}
在哪里
String javax.faces.FactoryFinder.FACES_CONTEXT_FACTORY = "javax.faces.context.FacesContextFactory"
JavaDocs for the
FactoryFinder
描述了所谓的standard discovery algorithm for all factory objects specified in the JavaServer Faces APIs.
这是我困惑的地方。
现在,让我们考虑创建工厂实例的实际方法:javax.faces.FactoryFinderInstance#getFactory(String factoryName)
try {
factoryOrList = factories.get(factoryName);
if (!(factoryOrList instanceof List)) {
return factoryOrList;
}
} finally {
lock.readLock().unlock();
}
factories
字段初始化如下 copyInjectionProviderFromFacesContext() :private void copyInjectionProviderFromFacesContext() {
InjectionProvider injectionProvider = null;
FacesContext context = FacesContext.getCurrentInstance(); //USE FACES CONTEXT!!!!!
if (null != context) {
injectionProvider = (InjectionProvider) context.getAttributes().get("com.sun.faces.config.ConfigManager_INJECTION_PROVIDER_TASK");
}
if (null != injectionProvider) {
factories.put(INJECTION_PROVIDER_KEY, injectionProvider);
} else {
if (LOGGER.isLoggable(Level.SEVERE)) {
LOGGER.log(Level.SEVERE, "Unable to obtain InjectionProvider from init time FacesContext. Does this container implement the Mojarra Injection SPI?");
}
}
}
因此,创建使用
FacesContext
实例,但工厂本身用于创建 FacesContext
.你不能解释那个循环吗?
最佳答案
有一个特殊的“init FacesContext”,它在 servlet 容器初始化期间可用,确保至少有“一个”FacesContext
在 JSF 初始化期间。这个特殊的“init FacesContext”有很多空/空/默认属性,特别是那些依赖于 HTTP servlet 请求/响应的属性,但与应用程序和配置相关的属性,例如可以通过 FacesContext#getApplication()
获得的属性。已经基于 a.o. faces-config.xml
.
在 Mojarra 的情况下,这个“init FacesContext”是 created在 a.o. com.sun.faces.config.FacesInitializer
, ServletContainerInitializer
在 webapp 启动期间运行的实现。在那一刻,工厂被创建。
关于jsf - 了解 FacesContext 实例化细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32391917/