莫贾拉 2.2.12
这是接管实例化的代码段面孔上下文 http://grepcode.com/file/repo1.maven.org/maven2/javax.faces/jsf-api/2.1/javax/faces/webapp/FacesServlet.java:
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
}
Where
String javax.faces.FactoryFinder.FACES_CONTEXT_FACTORY = "javax.faces.context.FacesContextFactory"
JavaDocs 为FactoryFinder
描述了所谓的
中指定的所有工厂对象的标准发现算法
JavaServer Faces API。
这就是我所困惑的。
现在,让我们考虑创建工厂实例的实际方法:javax.faces.FactoryFinderInstance#getFactory(String factoryName) http://grepcode.com/file/repo1.maven.org/maven2/javax.faces/jsf-api/2.1/javax/faces/FactoryFinder.java#FactoryFinder.FactoryManager.getFactory%28java.lang.ClassLoader%2Cjava.lang.String%29
try {
factoryOrList = factories.get(factoryName);
if (!(factoryOrList instanceof List)) {
return factoryOrList;
}
} finally {
lock.readLock().unlock();
}
The factories
字段初始化如下copyInjectionProviderFromFacesContext() http://grepcode.com/file/repo1.maven.org/maven2/com.sun.faces/jsf-api/2.2.8/javax/faces/FactoryFinderInstance.java#FactoryFinderInstance.copyInjectionProviderFromFacesContext%28%29:
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
。你不能解释一下这个循环吗?