web配置文件与Spring详解
在web.xml中定义contentConfigLocation参数,Spring会使用这个参数加载所有逗号分隔的.xml文件,Spring默认加载web-INF下的applicationContext.xml文件.
<content-param> <param-name>contentConfigLocation</param-name> <paramvalue>classpath*:config/applicationContext.xml,classpath*:config/applicationContext-shiro.xml </param-value> </content-param>
contencConfigLocation参数定义了要装入Spring的配置文件,装入的原理说明如下:
Sping中提供ServletContentListener的一个实现类contentLoaderListener,该类可以做一个Listener使用,如果要装入的配置文件只用一个并且名称为applicationContent.xml时,则只需要在文件中加入以下代码即可:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
如果要装入的配置文件有多个时,则需要使用<content-param>确定文件名称,由于contentLoaderListener加载时会查找名为contentConfigLocation的参数,因此,在定义<content-param>的名称时使用contentConfigLocation.
有多个配置文件如下配置:
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:config/applicationContext.xml,classpath*:config/applicationContext-shiro.xml </param-value> </context-param> <context-param> <param-name>webAppRootKey</param-name> <param-value>EPMAS.webapp.root</param-value> </context-param> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.properties</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
如果没有contentConfigLocation参数指定的配置文件,则Spring会自动的查找applicationContent.xml配置文件;如果配置有contentConfigLocation参数指定的配置文件,该参数指定的是一个字符串,Spring的contentLoaderListener负责将该字符串分解成多个配置文件,逗号,空格,分号多可以作为分隔符;如果没有contentConfigLocation参数指定为配置文件,也没有名称为applicationContent.xml的配置文件,都会导致Spring无法加载配置文件或者创建applicationContent实例异常.
注意:使用contentLoaderListener类来实现配置文件的装入仅适用于适用于Servlet2.4及以上规范Servlet容器。
基于contentLoaderServlet类来实现Spring配置文件的装入可以适用于servlet2.3以下规范的servlet容器:
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:config/applicationContext*.xml </param-value> </context-param> <servlet> <servlet-name>context</servlet-name> <servletclass> org.springframework.web.context.ContextLoaderServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>
Spring 提供了一个特殊的Servllet 类: ContextLoaderServlet。该Servlet 在启动时,会自动查找WEB-INF下的applicationContext. xml 文件。当然,为了让ContextLoaderServlet 随应用启动而启动,应将此Servlet 配置成load-on-startup 的Servleto load-on-startup 的值小一点比较合适,因为要保证ApplicationContext 优先创建。
从servlet容器启动时加载组件的顺序来看(ServletContext-> listener ->filter -> servlet),Listener组件是优先于Servlet组件的。基于Servlet方式的加载方案主要是为了兼容Servlet2.3及以下规范的Servlet容器。以Tomcat为例,Tomcat 5.x都已经支持Servlet2.4规范了,因此,基于Listener方式启动Spring容器是目前的主流选择。