codememo

스프링: web.xml의 네임스페이스 대 contextConfigLocation init 매개 변수

tipmemo 2023. 7. 27. 22:02
반응형

스프링: web.xml의 네임스페이스 대 contextConfigLocation init 매개 변수

Spring MVC에 대한 문서를 읽고 있는데 init params와 관련하여 질문이 있습니다.저는 스프링 3.2를 사용하고 있습니다.contextConfigLocation과 네임스페이스의 차이점은 무엇입니까?contextConfigLocation은 컨텍스트 클래스가 XML 정의를 찾을 수 있고 네임스페이스 특성이 파일 이름을 지정할 수 있는 폴더를 지정하기 위한 것입니까?

<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을 사용해야 합니까?경로를 지정해야 합니까?

TL;DR

다음에 대한 값을 설정합니다.contextConfigLocation사용자 지정 구성 파일을 지정해야 할 때마다 선택합니다.이렇게 하면 구성 파일 이름과 해당 위치를 모두 지정할 수 있습니다.

는 기본적으로 Spring 컨테이너 컨텍스트 로더 클래스에 사용할 구성 파일을 알려주는 대체 방법입니다.저는 절대 신경쓰지 않고 그냥 사용합니다.contextConfigLocation사용자 지정 구성 파일을 구성해야 할 때마다 선택합니다.

다음은 제 이전의 봄 프로젝트 중 하나의 예입니다(간단하게 설명하기 위해 일부 구성 생략).

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

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

긴 대답

좋아요, 우선 중요한 순간들을 분명히 해둡시다.다음과 같은 두 가지 유형의 컨텍스트를 처리합니다.

  1. 루트 컨텍스트(상위)
  2. 개별 서블릿 컨텍스트(하위)

Spring Framework API(이 문서를 작성한 시점에서 버전 3.2.2)에서 인용한 웹 애플리케이션 컨텍스트(강조 사항):

일반 응용프로그램 컨텍스트와 마찬가지로 웹 응용프로그램 컨텍스트는 계층적입니다.응용 프로그램마다 단일 루트 컨텍스트가 있는 반면, 응용 프로그램의 서블릿(MVC 프레임워크의 디스패처 서블릿 포함) 고유한 하위 컨텍스트를 가집니다.

또한 여기: 컨텍스트 계층:

예를 들어, Spring MVC 웹 응용프로그램을 개발하는 경우 일반적으로 Spring의 ContextLoaderListener를 통해 로드되는 루트 WebApplicationContext Spring의 DispatcherServlet을 통해 로드되는 하위 WebApplicationContext가 있습니다.따라서 공유 구성 요소 및 인프라 구성이 루트 컨텍스트에서 선언되고 웹 관련 구성 요소에 의해 하위 컨텍스트에서 사용되는 상위-하위 컨텍스트 계층이 생성됩니다.

그리고 여기: 17.2 디스패처 서블릿:

Spring의 ApplicationContext 인스턴스 범위를 지정할 수 있습니다.WebMVC 프레임워크에서 각 DispatcherServlet은 루트 WebApplicationContext에 이미 정의된 모든 빈을 상속하는 고유한 WebApplicationContext를 가집니다.이러한 상속된 빈은 서블릿별 범위에서 재정의할 수 있으며, 지정된 서블릿 인스턴스에 로컬인 새 범위별 빈을 정의할 수 있습니다.


이제 루트 응용프로그램 컨텍스트 구성을 살펴보겠습니다.다음은 예입니다.
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>


봄 공식 문서(광산 강조)에서:
5.14.4애플리케이션을 위한 편리한 애플리케이션 컨텍스트 인스턴스화:

예를 들어 ContextLoader를 사용하여 ApplicationContext 인스턴스를 선언적으로 만들있습니다.물론 ApplicationContext 구현 중 하나를 사용하여 ApplicationContext 인스턴스를 프로그래밍 방식으로 만들 수도 있습니다.

ContextLoaderListener를 사용하여 응용프로그램 컨텍스트를 등록할 수 있습니다(위 예제 참조).

수신기는 contextConfigLocation 매개 변수를 검사합니다.매개 변수가 없는 경우 수신기는 /WEB-INF/applicationContext.xml을 기본값으로 사용합니다.매개 변수가 있는 경우 수신기는 미리 정의된 구분 기호(콤마, 세미콜론 및 공백)를 사용하여 문자열을 구분하고 이 값을 응용 프로그램 컨텍스트를 검색할 위치로 사용합니다.개미 스타일의 경로 패턴도 지원됩니다.예를 들어 이름이 "WEB-INF" 디렉터리에 있는 "Context.xml"로 끝나는 모든 파일의 경우 /WEB-INF/*Context.xml이고 "WEB-INF"의 하위 디렉터리에 있는 모든 파일의 경우 /WEB-INF/**/*Context.xml입니다.


스프링 구성은 여러 파일로 분할되는 경우가 많습니다.특히 대규모 프로젝트에서는 더욱 논리적이고 편리합니다.이 예제에서는 사용자 지정 위치에 daoContext.xmlapplicationContext.xml 두 개의 구성 XML 파일을 명시적으로 정의했습니다./WEB-INF/spring/contextConfigLocation을 정의하지 않은 경우 ContextLoaderListener는 기본 구성 파일을 찾으려고 합니다.

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

따라서 기본 구성 파일이 필요에 맞지 않으면 ContextLoaderListener를 함께 사용합니다.<context-param> contextConfigLocation 루트 응용 프로그램 컨텍스트를 정의하는 사용자 지정 구성 파일을 정의할 수 있습니다.


다음은 개별(하위) 애플리케이션 컨텍스트를 살펴보겠습니다.봄 공식 문서(광산 강조)에서:
서블릿 17.2 스패

DispatcherServlet을 초기화하면 SpringMVC는 웹 응용 프로그램의 WEB-INF 디렉터리에서 [servlet-name]-servlet.xml이라는 파일을
찾고
정의된 빈을 생성하여 글로벌 범위에서 동일한 이름으로 정의된 빈의 정의를 재정의합니다.

web.xml 파일의 다음 Dispatcher Servlet 구성을 고려합니다.

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


contextConfigLocation 및 네임스페이스 정보

문서에서(광산 강조):

의 서블릿 할 경우, "" " " " " " 라는 합니다.
/WEB-INF/golfing-servlet.xml이 파일에는 Spring Web MVC별 구성요소(콩)가 모두 포함됩니다.Servlet 초기화 매개 변수를 통해 이 구성 파일의 정확한 위치를 변경할 수 있습니다(자세한 내용은 아래 참조).
...
Web.xml 파일의 Servlet 선언에 Servlet 초기화 매개 변수(init-param 요소)를 추가하여 개별 DispatcherServlet 인스턴스를 사용자 지정할 수 있습니다.지원되는 매개 변수 목록은 다음 표를 참조하십시오.

  • contextClass: 이 서블릿에서 사용하는 컨텍스트를 인스턴스화하는 WebApplicationContext를 구현하는 클래스입니다.기본적으로 XmlWebApplicationContext가 사용됩니다.

  • contextConfigLocation:컨텍스트를 찾을 수 있는 위치를 나타내는 컨텍스트 인스턴스(contextClass에서 지정)로 전달되는 문자열입니다.문자열은 여러 컨텍스트를 지원하기 위해 쉼표를 구분 기호로 사용하는 여러 문자열로 구성될 수 있습니다.빈이 두 번 정의된 여러 컨텍스트 위치의 경우 최신 위치가 우선합니다.

  • 네임스페이스:웹 응용 프로그램 컨텍스트의 네임스페이스입니다.기본값은 [servlet-name]-servlet입니다.


이제 관련 클래스에 대한 API 설명서를 조사해 보겠습니다.디스패처 서블릿 클래스는 추상 클래스 FrameworkServlet을 확장합니다.Framework Servlet API 문서(내 문서 강조)에서:

하고 "contextConfigLocation" servlet init-param과 할 수 합니다.
"test-servlet.xml, myServlet.xml"입니다.명시적으로 지정하지 않으면 컨텍스트 구현은 서블릿의 네임스페이스에서 기본 위치를 구축해야 합니다.

기본 네임스페이스는 "servlet-name'-servlet"입니다. 예를 들어 서블릿 이름 "test"의 경우 "test-servlet"입니다(XmlWebApplicationContext가 있는 "/WEB-INF/test-servlet.xml" 기본 위치로 연결됨).네임스페이스는 "namespace" servlet init-param을 통해 명시적으로 설정할 수도 있습니다.

다음은 Framework Servlet 소스 코드에서 발췌한 것입니다.
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의 기본 컨텍스트 클래스는 Xml웹 응용프로그램 컨텍스트입니다.XmlWebApplicationContext API 문서(내 문서 강조)에서 다음을 수행합니다.

기본적으로 구성은 루트 컨텍스트의 경우 "/WEB-INF/applicationContext.xml"에서 가져오고 네임스페이스 "test-servlet"이 있는 컨텍스트의 경우 "/WEB-INF/test-servlet.xml"에서 가져옵니다(예: 서블릿 이름 "test"가 있는 DispatcherServlet 인스턴스의 경우).

구성 위치 기본값은 ContextLoader의 "contextConfigLocation" 컨텍스트 매개 변수와 FrameworkServlet의 servlet init-param을 통해 재정의할 수 있습니다.구성 위치는 "/WEB-INF/context.xml"과 같은 구체적인 파일이나 "/WEB-INF/*-context.xml"과 같은 Ant-style 패턴을 나타낼 수 있습니다(패턴에 대한 자세한 내용은 PathMatcher javadoc 참조).

를 사용하여 contextConfigLocation루트 응용 프로그램 컨텍스트의 경우 위 예제와 동일합니다.

기본 네임스페이스를 재정의하는 것과 관련하여 몇 가지 중요한 순간이 있습니다.새 네임스페이스를 설정할 때 네임스페이스 앞에 추가하거나 추가하지 마십시오.그 이유는 소스 파일에서 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};
    }
}

보시다시피 소스 코드가 모든 것을 말해줍니다.


사용자 지정 네임스페이스 지정 예제

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


    <!-- 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는 컨이너가찾것니다입을테▁for다▁will니▁look를 찾습니다./WEB-INF/spring/mvc/spring-mvc.xml.

예:
사용자 지정 네임스페이스 설정과 관련된 위의 설명은 기본 Xml웹 응용프로그램 컨텍스트 컨텍스트 클래스에 대한 설명입니다.주석 구성웹 응용프로그램 컨텍스트와 같은 대체 클래스를 지정할 수 있으므로 이를 위한 특별한 순간이 있습니다.


결론

더 .contextConfigLocation루트 응용 프로그램 컨텍스트와 개별 컨텍스트 모두에 대해 사용자 지정 구성 파일을 정의하는 매개 변수입니다.유일한 차이점은 루트 응용프로그램 컨텍스트에서 사용한다는 것입니다.<web-app>요소, 그러나 특정 서블릿 내에는 없습니다(수신기 클래스도 잊지 마십시오).그리고 하위 컨텍스트의 경우 내부에 중첩되어 사용됩니다.<servlet> 특정 서블릿에 대한 요소입니다.이 게시물의 첫머리에 있는 구성 예(web.xml)를 참조하십시오.

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

내 생각엔 럭키루크의 대답은 많은 유용한 정보를 가지고 있지만, 그것은 질문에 대답하지 않습니다.특히, "namespace"와 "contextConfigLocation" 매개 변수는 어떻게 함께 작동합니까?

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

  • 네임스페이스 paremeter는 기본 컨텍스트 구성 위치를 구축하는 데 사용할 사용자 지정 네임스페이스를 설정합니다.
  • contextConfigLocation 매개 변수는 네임스페이스에서 빌드된 기본 위치에 의존하는 대신 컨텍스트 구성 위치를 명시적으로 설정합니다.

contextConfigLocation과 네임스페이스의 차이점은 무엇입니까?contextConfigLocation은 스프링 구성 파일의 경로를 지정하는 데 사용되며, 이는 해당 파일이 초기화됨을 의미합니다.네임스페이스는 SpringMVC의 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.
정의 contextConfigLocation을 수 입니까?

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

위의 코드는 애플리케이션이 봄을 시작할 때 WEB-INF/config 디렉토리에 이름이 'app-'로 시작하고 '.xml'로 끝나는 모든 파일을 로드한다는 것을 보여줍니다.

/WEB-INF/application-context.xml을?경로를 지정해야 합니까?
위의 모든 예를 통해 우리는 Spring을 구성할 때 전체 경로와 일반 파일 이름을 지정해야 하며 SpringMVC만 경로(WEB-INF 디렉토리를 포함하지 않고 디렉토리에 있는 경우)와 이름(확장자를 포함하지 않음)을 지정해야 한다는 것을 알 수 있습니다.
도움이 되길 바랍니다:)

언급URL : https://stackoverflow.com/questions/15818047/spring-namespace-vs-contextconfiglocation-init-parameters-in-web-xml

반응형