Spring MVC Web应用程序:应用程序上下文启动两次

我正在开发一个Spring MVC REST API。 一切正常,这很好,但我从日志中注意到,每次重新启动应用程序时,applicationContext都会加载两次:一次是tomcat加载war文件,第二次是第一次访问web应用程序时客户。

我举几个例子:

我启动tomcat后:

Apr 11, 2013 10:14:35 AM org.apache.catalina.core.StandardEngine start INFO: Starting Servlet Engine: Apache Tomcat/6.0.32 Apr 11, 2013 10:14:36 AM org.apache.catalina.core.ApplicationContext log INFO: Initializing Spring root WebApplicationContext 2013-04-11 10:14:36 INFO ContextLoader:273 - Root WebApplicationContext: initialization started 2013-04-11 10:14:36 INFO XmlWebApplicationContext:510 - Refreshing Root WebApplicationContext: startup date [Thu Apr 11 10:14:36 EDT 2013]; root of context hierarchy 2013-04-11 10:14:36 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml] 2013-04-11 10:14:36 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-general.xml] 2013-04-11 10:14:37 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-db.xml] 2013-04-11 10:14:37 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-security.xml] 2013-04-11 10:14:37 INFO SpringSecurityCoreVersion:33 - You are running with Spring Security Core 3.1.3.RELEASE 2013-04-11 10:14:37 INFO SecurityNamespaceHandler:59 - Spring Security 'config' module version is 3.1.3.RELEASE 

然后我现在进行第一次API调用:

 INFO: Initializing Spring FrameworkServlet 'mvc-dispatcher' 2013-04-11 10:15:25 INFO DispatcherServlet:455 - FrameworkServlet 'mvc-dispatcher': initialization started 2013-04-11 10:15:25 INFO XmlWebApplicationContext:510 - Refreshing WebApplicationContext for namespace 'mvc-dispatcher-servlet': startup date [Thu Apr 11 10:15:25 EDT 2013]; parent: Root WebApplicationContext 2013-04-11 10:15:25 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml] 2013-04-11 10:15:25 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-general.xml] 2013-04-11 10:15:25 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-db.xml] 2013-04-11 10:15:25 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-security.xml] 2013-04-11 10:15:25 INFO SecurityNamespaceHandler:59 - Spring Security 'config' module version is 3.1.3.RELEASE 

当然这不是正常的行为? 我的web.xml看起来像这样:

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd“>

 REST API   mvc-dispatcher org.springframework.web.servlet.DispatcherServlet   mvc-dispatcher /   contextConfigLocation /WEB-INF/mvc-dispatcher-servlet.xml    httpMethodFilter org.springframework.web.filter.HiddenHttpMethodFilter   httpMethodFilter mvc-dispatcher   etagFilter org.springframework.web.filter.ShallowEtagHeaderFilter   etagFilter mvc-dispatcher   CompressingFilter com.planetj.servlet.filter.compression.CompressingFilter  debug false   statsEnabled false    CompressingFilter mvc-dispatcher   springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /*    org.springframework.web.context.ContextLoaderListener  

mvc-dispatcher正在加载2x,因为这是你定义它的方式

  contextConfigLocation /WEB-INF/mvc-dispatcher-servlet.xml  

并在

  mvc-dispatcher org.springframework.web.servlet.DispatcherServlet   mvc-dispatcher /  

第一种方法通常用于加载类似“全局”或“根”上下文的内容,您可以在其中放置多个servlet上下文共享的所有bean /资源。

第二种方法通常用于加载特定的servlet上下文。 正如本文中的第一个答案所指出的,它使用命名约定来查找mvc-dispatcher配置文件,因此您无需显式定义它。

你有mvc-dispatcher-servlet.xml中定义的所有内容吗? 如果是这样,你可以删除

  ..  

定义,否则您可以(我建议将来可维护性)将您的配置分成多个文件。 然后在root-context.xml(通过第一个方法)中加载共享bean /资源,并在servletname-servlet.xml下为每个servlet上下文加载每个servlet特定的配置。