我正在研究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“>
<display-name>REST API</display-name> <!-- Servlets --> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value> </context-param> <!-- filters --> <filter> <filter-name>httpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>httpMethodFilter</filter-name> <servlet-name>mvc-dispatcher</servlet-name> </filter-mapping> <filter> <filter-name>etagFilter</filter-name> <filter-class>org.springframework.web.filter.ShallowEtagHeaderFilter</filter-class> </filter> <filter-mapping> <filter-name>etagFilter</filter-name> <servlet-name>mvc-dispatcher</servlet-name> </filter-mapping> <filter> <filter-name>CompressingFilter</filter-name> <filter-class>com.planetj.servlet.filter.compression.CompressingFilter</filter-class> <init-param> <param-name>debug</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>statsEnabled</param-name> <param-value>false</param-value> </init-param> </filter> <filter-mapping> <filter-name>CompressingFilter</filter-name> <servlet-name>mvc-dispatcher</servlet-name> </filter-mapping> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- listeners --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
mvc-dispatcher 正在加载2x,因为这是您定义的方式
mvc-dispatcher
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value> </context-param>
在
<servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
第一种方法通常是用于加载“全局”或“根”上下文之类的内容,您可以在其中放置多个servlet上下文共享的所有bean /资源。
第二种方法通常是用于加载特定的servlet上下文。它使用命名约定来找到mvc-dispatcher配置文件,因此您无需显式定义它。
在mvc-dispatcher-servlet.xml中定义了所有内容吗?如果是这样,您可以删除
<context-param> .. </context-param>
定义,否则,您可以(我建议为将来的可维护性)将您的配置分成多个文件。然后将共享的bean /资源加载到root- context.xml之类(通过第一种方法),并在每个servlet上下文的servletname- servlet.xml下加载每个servlet特定的配置。