看看Spring的contextLoader都做了什么
public class ContextLoader {
?
??????
?????? public static final String CONTEXT_CLASS_PARAM = "contextClass";
?
//此处定义了spring配置文件的参数名称,和web.xml中的
<context-param>
???? <param-name>contextConfigLocation</param-name>
???? <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/dataAccessContext-IBatis.xml</param-value>
</context-param>
完全对应,这个名字是不可更改的
?????? public static final String CONFIG_LOCATION_PARAM = "contextConfigLocation";
?
??????
?????? public static final String LOCATOR_FACTORY_SELECTOR_PARAM = "locatorFactorySelector";
?
??????
?????? public static final String LOCATOR_FACTORY_KEY_PARAM = "parentContextKey";
?
??????
?????? private static final String DEFAULT_STRATEGIES_PATH = "ContextLoader.properties";
?
?
?????? private static final Properties defaultStrategies;
?
?????? static {
????????????? // Load default strategy implementations from properties file.
????????????? // This is currently strictly internal and not meant to be customized
????????????? // by application developers.
????????????? try {
???????????????????? ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, ContextLoader.class);
???????????????????? defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
????????????? }
????????????? catch (IOException ex) {
???????????????????? throw new IllegalStateException("Could not load 'ContextLoader.properties': " + ex.getMessage());
????????????? }
?????? }
?
?
?????? private final Log logger = LogFactory.getLog(ContextLoader.class);
?
?????? /**
?????? * The root WebApplicationContext instance that this loader manages.
?????? */
?????? private WebApplicationContext context;
?
?????? /**
?????? * Holds BeanFactoryReference when loading parent factory via
?????? * ContextSingletonBeanFactoryLocator.
?????? */
?????? private BeanFactoryReference parentContextRef;
?
?
??????
?????? .......
??????
?????? protected WebApplicationContext createWebApplicationContext(
???????????????????? ServletContext servletContext, ApplicationContext parent) throws BeansException {
?
????????????? Class contextClass = determineContextClass(servletContext);
????????????? if (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)) {
???????????????????? throw new ApplicationContextException("Custom context class [" + contextClass.getName() +
?????????????????????????????????? "] is not of type [" + ConfigurableWebApplicationContext.class.getName() + "]");
????????????? }
?
????????????? ConfigurableWebApplicationContext wac =
??????????????????????????? (ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
????????????? wac.setParent(parent);
????????????? wac.setServletContext(servletContext);
//这里getInitParameter()方法概述:public java.lang.String getInitParameter(java.lang.String name)返回上下文定义的变量的值,如果变量不存在,返回null。见ServletConfig.getInitParameter (java.lang.String)。
????????????? String configLocation = servletContext.getInitParameter(CONFIG_LOCATION_PARAM);
//最后使用configLocation初始化wac对象
????????????? if (configLocation != null) {
???????????????????? wac.setConfigLocations(StringUtils.tokenizeToStringArray(configLocation,
?????????????????????????????????? ConfigurableWebApplicationContext.CONFIG_LOCATION_DELIMITERS));
????????????? }
?
????????????? wac.refresh();
????????????? return wac;
?????? }
?
??????
????? .......
?
?
?
??????
?
?
?
}