ContextLoader类的结构如图:
ContextLoader类的源码:
package org.springframework.web.context;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.ServletContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.access.BeanFactoryLocator;
import org.springframework.beans.factory.access.BeanFactoryReference;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextException;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.access.ContextSingletonBeanFactoryLocator;
import org.springframework.core.GenericTypeResolver;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
public class ContextLoader {
//配置root WebApplicationContext 的实现类
public static final String CONTEXT_CLASS_PARAM = "contextClass";
//在web.xml中配置的root WebApplicationContext id用于BeanFactory序列化
public static final String CONTEXT_ID_PARAM = "contextId";
public static final String CONTEXT_INITIALIZER_CLASSES_PARAM = "contextInitializerClasses";
//see org.springframework.web.context.support.XmlWebApplicationContext#DEFAULT_CONFIG_LOCATION
public static final String CONFIG_LOCATION_PARAM = "contextConfigLocation";
//可选的servlet context parameter参数,被用于当获取一个parent context时使用的是默认实现,loadParentContext(ServletContext servletContext) 指定 'selector' 用于ContextSingletonBeanFactoryLocator#getInstance(String selector)方法,该方法被用于获取parent context后从parent context获取BeanFactoryLocator实例,默认的配置是classpath*:beanRefContext.xml对应的默认应用于ContextSingletonBeanFactoryLocator#getInstance()方法,该方法对应有一个parentContextKey
public static final String LOCATOR_FACTORY_SELECTOR_PARAM = "locatorFactorySelector";
//同上可选的servlet context parameter参数parentContextKey。用于BeanFactoryLocator#useBeanFactory(String factoryKey)指定factoryKey 从BeanFactoryLocator中获取parent application context,默认依赖于 classpath*:beanRefContext.xml选取候选工厂参数
public static final String LOCATOR_FACTORY_KEY_PARAM = "parentContextKey";
//相对于ContextLoader class的资源路径,定义了ContextLoader的默认策略名称
private static final String DEFAULT_STRATEGIES_PATH = "ContextLoader.properties";
private static final Properties defaultStrategies;
static {
try {
ClassPathRes