복붙노트

[SPRING] 스프링 MVC 웹 응용 프로그램 : 응용 프로그램 컨텍스트가 두 번 시작됩니다.

SPRING

스프링 MVC 웹 응용 프로그램 : 응용 프로그램 컨텍스트가 두 번 시작됩니다.

저는 Spring MVC REST API에 대해 연구하고 있습니다. 모든 것이 잘 작동하지만 로그에서 애플리케이션을 다시 시작할 때마다 applicationContext가 두 번로드된다는 사실을 알게되었습니다. 한 번은 Tomcat이 war 파일을로드 할 때가 있고 두 번째는 웹 앱이 처음으로 액세스 할 때입니다. 고객.

몇 가지 예를 들어 보겠습니다.

바람둥이 시작 직후 :

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>

해결법

  1. ==============================

    1.mvc-dispatcher는 사용자가 정의한 방식이므로 2x를로드 중입니다.

    mvc-dispatcher는 사용자가 정의한 방식이므로 2x를로드 중입니다.

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

    첫 번째 방법은 일반적으로 "글로벌"또는 "루트"컨텍스트와 같은 것을로드하는 것입니다. 여기서 여러 개의 서블릿 컨텍스트에 의해 공유되는 모든 bean / resources를 둘 수 있습니다.

    두 번째 방법은 대개 특정 서블릿 컨텍스트를로드하는 것입니다. 이 게시물의 첫 번째 답변은 mvc-dispatcher 구성 파일을 찾기 위해 명명 규칙을 사용하므로 명시 적으로 정의 할 필요가 없습니다.

    mvc-dispatcher-servlet.xml에 정의 된 모든 것이 있습니까? 그렇다면

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

    그렇지 않으면 (미래의 유지 보수성을 위해 권장하는) 구성을 여러 파일로 분리 할 수 ​​있습니다. 그런 다음 첫 번째 메소드를 통해 root-context.xml과 같은 형태로 공유 beans / resource를로드하고 각 servlet 컨텍스트에 대해 servletname-servlet.xml 아래의 각 servlet 특정 구성을로드하십시오.

  2. from https://stackoverflow.com/questions/15951257/spring-mvc-web-app-application-context-starts-twice by cc-by-sa and MIT license