今天想写一个springmvc的demo程序,但是一直在报找不到applicationContext.xml配置文件的错误。我当时将配置文件放在了classpath下,以为spring启动时默认是在classpath下寻找的,但是实际上不是,这里做一个记录。
如果使用xml配置方式,那么默认会使用XmlWebApplicationContext类型的容器。
该容器实现了loadBeanDefinition方法:
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws IOException { String[] configLocations = getConfigLocations(); if (configLocations != null) { for (String configLocation : configLocations) { reader.loadBeanDefinitions(configLocation); } } }这个方法会加载bean,从configLocation处加载,下面看下这个getConfigLocations方法:
protected String[] getConfigLocations() { return (this.configLocations != null ? this.configLocations : getDefaultConfigLocations()); }如果没有显示指定,默认走default:
@Override protected String[] getDefaultConfigLocations() { if (getNamespace() != null) { return new String[] {DEFAULT_CONFIG_LOCATION_PREFIX + getNamespace() + DEFAULT_CONFIG_LOCATION_SUFFIX}; } else { return new String[] {DEFAULT_CONFIG_LOCATION}; } }如果namespace不为空,说明这是servlet子容器,dispatcherServlet在启动时会将servlet的名字设置为这个namespace。看下dispatcherServlet如何设置这个namespace的:
public String getNamespace() { return (this.namespace != null ? this.namespace : getServletName() + DEFAULT_NAMESPACE_SUFFIX); } public static final String DEFAULT_NAMESPACE_SUFFIX = "-servlet";如果没有显示指定,就是${servletname}-servlet。
如果namesapce为空,那么就是父容器。
贴一下getConfigLocation里的几个常量:
/** Default config location for the root context */ public static final String DEFAULT_CONFIG_LOCATION = "/WEB-INF/applicationContext.xml"; /** Default prefix for building a config location for a namespace */ public static final String DEFAULT_CONFIG_LOCATION_PREFIX = "/WEB-INF/"; /** Default suffix for building a config location for a namespace */ public static final String DEFAULT_CONFIG_LOCATION_SUFFIX = ".xml";所以,
父容器的默认配置路径:/WEB-INF/appcalitionContext.xml
子容器的默认配置路径:/WEB-INF/${servletName}-servlet.xml
也就是说,默认位置找/WEB-INF目录下的配置文件。
