读书人

见见Spring的contextLoader都做了什么

发布时间: 2012-10-18 13:46:55 作者: rapoo

看看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;

?????? }

?

??????

????? .......

?

?

?

??????

?

?

?

}

读书人网 >软件架构设计

热点推荐