Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring MVC web app: application context starts twice

Tags:

I'm working on a Spring MVC REST API. Everything works fine, which is great, but I noticed from the logs that every time I restart my app the applicationContext loads twice: once when tomcat loads the war file, and a second time when the web app is accessed for the first time by a client.

I'll give a few examples:

Right after I start the 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 

...

And then at the moment I do the first API call:

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 

Surely this can't be normal behavior?? My web.xml looks like this:

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> 

like image 348
Hendrik Avatar asked Apr 11 '13 14:04

Hendrik


People also ask

Can we have two application context in Spring?

You can have two contexts within an application. If you have two contexts each will have its own singleton.

What is web application context in Spring MVC?

What is WebApplicationContext in Spring MVC? WebApplicationContext in Spring is a web-aware ApplicationContext i.e it has Servlet Context information. In a single web application, there can be multiple WebApplicationContext. That means each DispatcherServlet is associated with a single WebApplicationContext.

How does Spring application context work?

ApplicationContext is a corner stone of a Spring Boot application. It represents the Spring IoC container and is responsible for instantiating, configuring, and assembling the beans. The container gets its instructions on what objects to instantiate, configure, and assemble by reading configuration metadata.

Where is application context in Spring MVC?

ApplicationContext (Root Application Context) : Every Spring MVC web application has an applicationContext. xml file which is configured as the root of context configuration. Spring loads this file and creates an applicationContext for the entire application.


1 Answers

mvc-dispatcher is loading 2x because that is how you've defined it

<context-param>     <param-name>contextConfigLocation</param-name>     <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value> </context-param> 

and at

<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> 

the first approach is usually for loading something like a "global" or "root" context, where you might put all the bean/resources shared by multiple servlet contexts.

The second approach is usually for loading a specific servlet context. As the first answer in this post points out, it uses naming convention to find the mvc-dispatcher config file, so you don't need to explicitly define it.

Do you have everything defined in mvc-dispatcher-servlet.xml? If so you can remove the

<context-param>   .. </context-param> 

definition, otherwise you can (which I recommend for future maintainability) separate your configuration into multiple files. Then load shared beans/resource in something like a root-context.xml (via the first method), and each servlet specific config under servletname-servlet.xml for each servlet context.

like image 82
ikumen Avatar answered Oct 22 '22 14:10

ikumen