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特定的配置。