복붙노트

[SPRING] Spring : 네임 스페이스와 web.xml의 contextConfigLocation 초기화 매개 변수

SPRING

Spring : 네임 스페이스와 web.xml의 contextConfigLocation 초기화 매개 변수

Spring MVC에 대한 문서를 읽고 있는데 init params에 관한 질문이있다. 중요하다면 Spring 3.2를 사용하고있다. contextConfigLocation과 네임 스페이스의 차이점은 무엇입니까? contextConfiguration은 컨텍스트 클래스가 XML 정의를 찾을 수있는 폴더를 지정하기위한 것이며 namespace 속성은 파일 이름을 지정하기위한 것입니까?

<servlet>
        <servlet-name>AppServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>WEB-INF</param-value>
        </init-param>
        <init-param>
            <param-name>namespace</param-name>
            <param-value>application-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

이 올바른지? 사용해야합니까 /WEB-INF/application-context.xml? 경로를 지정해야합니까?

해결법

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

    1.custom config 파일을 지정할 필요가있을 때마다 contextConfigLocation의 값을 설정하기 만하면됩니다. 이렇게하면 구성 파일 이름과 그 위치를 모두 지정하게됩니다.

    custom config 파일을 지정할 필요가있을 때마다 contextConfigLocation의 값을 설정하기 만하면됩니다. 이렇게하면 구성 파일 이름과 그 위치를 모두 지정하게됩니다.

    네임 스페이스는 본질적으로 스프링 컨테이너 컨텍스트 로더 클래스에게 사용할 설정 파일을 알려주는 또 다른 방법이다. 난 그걸로 귀찮게하지 않지만, 단지 사용자 정의 구성 파일을 구성해야 할 때마다 contextConfigLocation을 사용하십시오.

    다음은 이전의 Spring 프로젝트 중 하나의 예제입니다 (간결성을 위해 생략 된 구성 중 일부).

    을 포함한다.

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                                http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    
        <display-name>Spring Web Application example</display-name>
    
        <!-- Configurations for the root application context (parent context) -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/spring/jdbc/spring-jdbc.xml
                /WEB-INF/spring/security/spring-security-context.xml
            </param-value>
        </context-param>
    
        <!-- Configurations for the DispatcherServlet application context (child context) -->
        <servlet>
            <servlet-name>spring-mvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>
                    /WEB-INF/spring/mvc/spring-mvc-servlet.xml
                </param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>spring-mvc</servlet-name>
            <url-pattern>/admin/*</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

    좋아, 먼저 중요한 순간을 분명히하자. 두 가지 유형의 컨텍스트가 있습니다.

    WebApplicationContext (emphasis mine)에 대한 Spring Framework API (이 글을 쓰는 순간 버전 3.2.2)에서 인용하자.

    또한 여기에서 : 컨텍스트 계층 구조 :

    17.2 The DispatcherServlet :

    이제 루트 응용 프로그램 컨텍스트 구성을 살펴 보겠습니다. 다음은 그 예입니다. web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                                http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/spring/daoContext.xml
                /WEB-INF/spring/applicationContext.xml
            </param-value>
        </context-param>
    </web-app>
    

    공식적인 Spring 문서 (중점 광산)에서 : 5.14.4 웹 애플리케이션을위한 편리한 ApplicationContext 인스턴스화 :

    꽤 자주 Spring 설정은 여러 파일로 분할됩니다. 특히 대규모 프로젝트의 경우 논리적이고 편리합니다. 이 예에서는 사용자 정의 위치의 / WEB-INF / spring /에있는 두 개의 구성 XML 파일 인 daoContext.xml과 applicationContext.xml을 명시 적으로 정의했습니다. ContextLoaderListener는 contextConfigLocation을 정의하지 않았 으면 기본 구성 파일 인 /WEB-INF/applicationContext.xml을 찾으려고 시도합니다.

    노트: 루트 컨텍스트는 선택 사항입니다. 이 답변도 참조하십시오 : https://stackoverflow.com/a/7451389/814702

    그러므로 기본 /WEB-INF/applicationContext.xml 설정 파일이 여러분의 필요에 맞지 않다면, contextConfigLocation과 함께 ContextLoaderListener를 사용하여 사용자 정의 설정 파일을 정의하여 루트 애플리케이션 컨텍스트를 정의 할 수 있습니다.

    다음으로 개별 (하위) 애플리케이션 컨텍스트를 살펴 보겠습니다. 공식적인 Spring 문서 (중점 광산)에서 : 17.2 DispatcherServlet

    <web-app>
    
        <servlet>
            <servlet-name>golfing</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>golfing</servlet-name>
            <url-pattern>/golfing/*</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

    문서에서 (중점 광산) :

    이제 관련 클래스에 대한 API 문서를 살펴 보겠습니다. DispatcherServlet 클래스는 추상 클래스 인 FrameworkServlet을 상속합니다. FrameworkServlet API 문서 (emphasis mine)에서

    다음은 FrameworkServlet 소스 코드에서 발췌 한 내용입니다. FrameworkServlet.java

    ....
    /**
    * Suffix for WebApplicationContext namespaces. If a servlet of this class is
    * given the name "test" in a context, the namespace used by the servlet will
    * resolve to "test-servlet".
    */
    public static final String DEFAULT_NAMESPACE_SUFFIX = "-servlet";
    ....
    

    FrameworkServlet의 기본 컨텍스트 클래스는 XmlWebApplicationContext입니다. XmlWebApplicationContext API에서 docs (emphasis mine) :

    contextConfigLocation을 사용하여 기본 구성 위치를 무시하는 것은 위의 예에서 루트 응용 프로그램 컨텍스트와 동일합니다.

    기본 네임 스페이스를 재정의하는 것과 관련하여 몇 가지 중요한 순간이 있습니다. 새 네임 스페이스를 설정할 때 / WEB-INF 앞에 추가하지 말고 .xml을 추가하지 마십시오. 그 이유는 소스 파일에서 XmlWebApplicationContext 클래스를 보면 알 수 있습니다. XmlWebApplicationContext.java

    ...
    
    /** Default config location for the root context */
    public static final String DEFAULT_CONFIG_LOCATION = "/WEB-INF/applicationContext.xml";
    
    /** Default prefix for building a config location for a namespace */
    public static final String DEFAULT_CONFIG_LOCATION_PREFIX = "/WEB-INF/";
    
    /** Default suffix for building a config location for a namespace */
    public static final String DEFAULT_CONFIG_LOCATION_SUFFIX = ".xml";
    
    ...
    
    /**
    * The default location for the root context is "/WEB-INF/applicationContext.xml",
    * and "/WEB-INF/test-servlet.xml" for a context with the namespace "test-servlet"
    * (like for a DispatcherServlet instance with the servlet-name "test").
    */
    @Override
    protected String[] getDefaultConfigLocations() {
        if (getNamespace() != null) {
            return new String[] {DEFAULT_CONFIG_LOCATION_PREFIX + getNamespace() + DEFAULT_CONFIG_LOCATION_SUFFIX};
        }
        else {
            return new String[] {DEFAULT_CONFIG_LOCATION};
        }
    }
    

    보시다시피, 소스 코드는 그것을 모두 말합니다.

    을 포함한다.

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                                http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    
    
        <!-- Configurations for the DispatcherServlet application context (child context) -->
        <servlet>
            <servlet-name>spring-mvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>namespace</param-name>
                <param-value>spring/mvc/spring-mvc</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>spring-mvc</servlet-name>
            <url-pattern>/*</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

    결과적으로 구성 파일에 대한 경로를 구성하는 데 기본 네임 스페이스를 사용하는 대신 /WEB-INF/spring-mvc-servlet.xml이 사용되며 컨테이너는 / WEB-INF / spring / mvc를 찾습니다. /spring-mvc.xml.

    노트: 위의 사용자 지정 네임 스페이스 설정과 관련된 설명은 기본 XmlWebApplicationContext 컨텍스트 클래스에 대한 설명입니다. AnnotationConfigWebApplicationContext와 같은 다른 클래스를 지정할 수 있으므로 특별한 순간이있을 것입니다.

    (IMHO) contextConfigLocation 매개 변수를 사용하여 루트 응용 프로그램 컨텍스트와 개별 컨텍스트에 대한 사용자 지정 구성 파일을 훨씬 더 쉽게 정의 할 수 있습니다. 유일한 차이점은 루트 애플리케이션 컨텍스트에서는 요소 내에서 을 사용하지만 특정 서블릿에서는 그렇지 않다는 것입니다 (리스너 클래스도 잊지 마십시오). 그리고 자식 컨텍스트의 경우 요소 내에 을 중첩하여 각 특정 서블릿에 사용합니다. 이 게시물의 맨 처음에 예제 구성 (web.xml)을 참조하십시오.

    추가 리소스 (위의 내용이 충분하지 않은 경우 :-)) :

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

    2.나는 LuckyLuke의 대답이 많은 유용한 정보를 가지고 있다고 생각하지만 질문에는 대답하지 않는다. 특히 "네임 스페이스"와 "contextConfigLocation"매개 변수가 함께 작동하는 방식은 무엇입니까?

    나는 LuckyLuke의 대답이 많은 유용한 정보를 가지고 있다고 생각하지만 질문에는 대답하지 않는다. 특히 "네임 스페이스"와 "contextConfigLocation"매개 변수가 함께 작동하는 방식은 무엇입니까?

    구체적인 대답을 찾을 수있는 유일한 곳은 소스 코드입니다.

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

    3.contextConfigLocation과 네임 스페이스의 차이점은 무엇입니까? contextConfigLocation은 봄 구성 파일의 경로를 지정하는 데 사용됩니다. 즉, 스프링 구성 파일이 초기화 될 것임을 의미합니다. 네임 스페이스는 Spring MVC의 DispatcherServlet의 경로와 이름을 지정하기 위해 사용된다. 기본값은 [Dispatcher_name] -servlet.xml입니다. 예제는 다음과 같습니다.

    contextConfigLocation과 네임 스페이스의 차이점은 무엇입니까? contextConfigLocation은 봄 구성 파일의 경로를 지정하는 데 사용됩니다. 즉, 스프링 구성 파일이 초기화 될 것임을 의미합니다. 네임 스페이스는 Spring MVC의 DispatcherServlet의 경로와 이름을 지정하기 위해 사용된다. 기본값은 [Dispatcher_name] -servlet.xml입니다. 예제는 다음과 같습니다.

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>namespace</param-name>
            <param-value>config/spring-mvc</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    

    Spring은 /WEB-INF/config/spring-mvc.xml의 경로로 mvc config로 사용될 파일을 검색 할 것입니다. contextConfiguration은 컨텍스트 클래스가 XML 정의를 찾을 수있는 폴더를 지정하기위한 용도로만 사용됩니다.

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/config/app-*.xml</param-value>
    </context-param>
    

    위의 코드는 Spring을 시작하는 응용 프로그램이 WEB-INF / config 디렉토리에 'app-'로 시작하고 '.xml'로 끝나는 모든 파일을로드 할 때 나타납니다.

    사용해야합니까 /WEB-INF/application-context.xml? 경로를 지정해야합니까? 위의 예제를 통해 우리는 Spring을 구성 할 때 전체 경로와 일반 파일 이름을 지정해야하며 SpringMVC 만 (경로가 WEB-INF 디렉토리를 포함하지 않는 디렉토리에있을 경우) 경로를 지정해야한다는 것을 알 수 있습니다. (확장을 포함하지 않음). 희망이 당신을 도울 :)

  4. from https://stackoverflow.com/questions/15818047/spring-namespace-vs-contextconfiglocation-init-parameters-in-web-xml by cc-by-sa and MIT license