如下web.xml示例:
1.用spring的配置加載contextConfigLocation
2.配置spring-mvc的contextConfigLocation
<servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-*.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring-mvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-*.xml</param-value> </context-param>
看了配置,spring下面的文件在springmvc中加載了一次,在context中又加載了一次。
從啟動日志和啟動時長可以看到。 補充:重復加載還會導致配置的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>
springmvc的xml單獨配置出來,spring本身管spring的,springmvc管springmvc的,這樣就ok了
總結:該分開配置的不要合在一起。注意代碼使用
