복붙노트

[SPRING] Spring Servlet 프로젝트의 web.xml에서 contextConfigLocation을로드하는 순서

SPRING

Spring Servlet 프로젝트의 web.xml에서 contextConfigLocation을로드하는 순서

Spring Java 프로젝트가 있으며 웹 서버 서블릿으로 구성하려고한다고 가정합니다. 다음은 제거 된 web.xml 파일 버전입니다.

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring/generalApplicationContext.xml
    </param-value>
</context-param>

<servlet>
    <servlet-name>my-servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/specificApplicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>my-servlet</servlet-name>
    <url-pattern>/foo/*</url-pattern>
</servlet-mapping>

여기서 주목해야 할 핵심은 두 개의 XML 파일을로드하도록 지정했기 때문입니다. 하나는 내 응용 프로그램 전체에 대한 것이고 다른 하나는 "내 서블릿"서블릿에만 해당됩니다. 하나의 서블릿 매핑 만있는 설정의 경우 이는 의미가 없습니다. 그러나, 내 프로젝트에는 여러 개의 서블릿 매핑이 있으며 각 프로젝트에는 특정 Spring 설정이 있습니다.

내 질문 : 어떤 contextConfigLocation이 Spring에 의해 먼저로드 될 것입니까? generalApplicationContext.xml이 될 것인가 아니면 specificApplicationContext.xml이 될 것인가? 더 중요한 것은, 로딩의 순서는 문제가되는 것인가? 필자가 디버깅을 시도했을 때, 하나의 파일에서 다른 파일로 독립적 인 Spring 설정을 옮길 때 다른 에러가 발생했기 때문에 에러가 발생했다.

NB : 다중 서블릿 매핑에 여러 스프링 구성을 사용할지 여부는 논쟁의 여지가 있습니다. 새 Java 구성 대신 XML 구성을 사용하는 경우에도 동일합니다. 하지만 여기서 물어 보려는 것이 아닙니다. 내 주요 질문에 집중하겠습니다.

해결법

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

    1.generalApplicationContext.xml은 ContextLoaderListener로로드 된 ApplicationContext이기 때문에 먼저로드됩니다.

    generalApplicationContext.xml은 ContextLoaderListener로로드 된 ApplicationContext이기 때문에 먼저로드됩니다.

    <listener>
         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring/generalApplicationContext.xml
        </param-value>
    </context-param>
    

    specificApplicationContext.xml은 실제로 위에로드 된 generalApplicationContext.xml의 하위 컨텍스트이고 WebApplicationContext가됩니다.

    <servlet>
        <servlet-name>my-servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/specificApplicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>my-servlet</servlet-name>
        <url-pattern>/foo/*</url-pattern>
    </servlet-mapping>
    

    그리고 예. 적재 순서는 중요합니다. 부모 컨텍스트가로드 될 때 필요한 모든 종속성이 충족되어야하기 때문입니다.

  2. ==============================

    2.아래 부분은 컨텍스트 파일을로드하고 ApplicationContext를 생성합니다. 이 컨텍스트에는 예를 들어 미들 티어 트랜잭션 서비스, 데이터 액세스 개체 또는 응용 프로그램에서 사용하고 재사용 할 수있는 기타 개체와 같은 구성 요소가 포함될 수 있습니다. 응용 프로그램마다 하나의 응용 프로그램 컨텍스트가 있습니다.

    아래 부분은 컨텍스트 파일을로드하고 ApplicationContext를 생성합니다. 이 컨텍스트에는 예를 들어 미들 티어 트랜잭션 서비스, 데이터 액세스 개체 또는 응용 프로그램에서 사용하고 재사용 할 수있는 기타 개체와 같은 구성 요소가 포함될 수 있습니다. 응용 프로그램마다 하나의 응용 프로그램 컨텍스트가 있습니다.

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring/generalApplicationContext.xml
        </param-value>
    </context-param>
    

    다른 컨텍스트는 응용 프로그램 컨텍스트의 하위 컨텍스트 인 WebApplicationContext입니다. Spring 웹 애플리케이션에 정의 된 각각의 DispatcherServlet에는 연관된 WebApplicationContext가있다. WebApplicationContext의 초기화는 다음과 같이됩니다.

    <servlet>
        <servlet-name>my-servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/specificApplicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    

    자세한 내용은 여기를 참조하십시오.

  3. ==============================

    3.Spring 디버그 로그를 실제로 가지고있는 더 좋은 방법은 그 자체로 순서를 말해 준다. 코드를 작성하려면 org.springframework.web.servlet.FrameworkServlet (DispatcherServlet이이 클래스를 확장 함)을 살펴볼 수도 있습니다. 로거 "org.springframework.web.servlet"을 원하는대로 디버깅 할 수 있습니다. 로깅 프레임 워크

    Spring 디버그 로그를 실제로 가지고있는 더 좋은 방법은 그 자체로 순서를 말해 준다. 코드를 작성하려면 org.springframework.web.servlet.FrameworkServlet (DispatcherServlet이이 클래스를 확장 함)을 살펴볼 수도 있습니다. 로거 "org.springframework.web.servlet"을 원하는대로 디버깅 할 수 있습니다. 로깅 프레임 워크

    로그는 일반적으로 다음과 같이 보입니다. - 루트 컨텍스트가 먼저로드되고 컨텍스트 계층 구조의 부모로 설정 됨이 분명합니다. 서블릿 컨텍스트가 다음에로드됩니다.

    INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from ServletContext resource [/WEB-INF/spring/generalApplicatonContext.xml]
    INFO : org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 256 ms
    DEBUG: org.springframework.web.servlet.DispatcherServlet - Initializing servlet 'my-servlet'
    INFO :Initializing Spring FrameworkServlet 'appServlet'
    INFO : org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'my-servlet': initialization started
    DEBUG: org.springframework.web.servlet.DispatcherServlet - Servlet with name 'appServlet' will try to create custom WebApplicationContext context of class 'org.springframework.web.context.support.XmlWebApplicationContext', using parent context [Root WebApplicationContext: startup date [Fri May 15 17:08:24 IST 2015]; root of context hierarchy
    DEBUG: Loading XML bean definitions from ServletContext resource [/WEB-INF/spring/specificApplicationContext.xml
    
  4. ==============================

    4.web.xml 스프링에 ContextLoaderListener를 가지고 있다면 먼저 generalApplicationContext.xml을로드합니다. 이것은 빈을 생성하고 모든 서블릿과 필터를 제공합니다. 이 xml에는 응용 프로그램에 사용되는 bean 인 공통 클래스가 있어야합니다.

    web.xml 스프링에 ContextLoaderListener를 가지고 있다면 먼저 generalApplicationContext.xml을로드합니다. 이것은 빈을 생성하고 모든 서블릿과 필터를 제공합니다. 이 xml에는 응용 프로그램에 사용되는 bean 인 공통 클래스가 있어야합니다.

    나중의 스프링 컨테이너는 서블릿 구성에서 시작시로드가 있기 때문에 specificApplicationContext.xml을로드합니다. 시작시로드를 지정하지 않으면 특정 URL 패턴을 사용하여 응용 프로그램에 첫 번째 요청이 들어올 때이 specificApplicationContext.xml이로드됩니다.

    한 config에서 다른 config로 springconfig를 옮길 때의 질문으로 컨테이너에 대한 응용 프로그램 자원 가용성이 변경됩니다. generalApplicationContext.xml에 Controller Bean을 지정하고 specificApplicationContext.xml에 Controller Bean을 지정하지 않으면 DispatcherServlet이 매핑을 찾지 못해 404 오류가 표시됩니다.

    필요에 따라 몇 개의 Bean 객체를 생성하려면 특정 specificConfigurationFile2.xml을로드 할 servlet-config를 하나 더 만들고 url-pattern에 매핑 할 수 있습니다.

  5. from https://stackoverflow.com/questions/27539610/order-of-loading-contextconfiglocation-in-web-xml-of-spring-servlet-project by cc-by-sa and MIT license