如下web.xml示例:
part1.用spring的配置加载contextConfigLocation
2.配置spring-mvc的contextConfigLocation
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-*.xml
</param-value>
</context-param>
---------------------------------------------------------------------------
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--查找controller位置的xml文件配置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--查找这里可以配置多个,用逗号分割或者用通配符*也就是第二行 -->
<param-value>/WEB-INF/classes/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
非常不幸,part1+2不能互相替代, 并且,如果两部分的xml重复命中,比如spring-*,就会导致springmvc的映射,scan重复加载两次。从启动日志和启动时长可以看到。 补充:重复加载还会导致配置的task,schadule任务重复执行!
所以,合理的做法是,把spring-mvc的定义单独摘出来定义在web容器启动的时候加载,名称也换成servlet-mvc.xml避免被spring重复加载, 而在spring的core xml定义中,不要出现mvc的东东
<servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--查找controller位置的xml文件配置 --> <init-param> <param-name>contextConfigLocation</param-name> <!--查找这里可以配置多个,用逗号分割或者用通配符*也就是第二行 --> <param-value>/WEB-INF/classes/servlet-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet>
<!-- (Annotation方式配置services)enable component scanning (beware that this
does not enable mapper scanning!) -->
<context:component-scan base-package="com.xx.controller" />
<!-- enable autowire -->
<context:annotation-config />
<!-- 默认的注解映射的支持 -->
<mvc:annotation-driven />
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*/**"/>
<bean class="com.xx.interceptors.DebugLogInterceptor" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<mvc:mapping path="/group/**"/>
<mvc:mapping path="/groupalbum/**"/>
<mvc:mapping path="/message/**"/>
<mvc:exclude-mapping path="/user/login"/>
<mvc:exclude-mapping path="/user/c/mobile"/>
<mvc:exclude-mapping path="/user/c/email"/>
<bean class="com.hoomic.interceptors.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>