2012-08-27 2 views
0

나는 종종 내가 콩을 정의해야하는 상황에 맞는 결정 투쟁 중 하나 root-context.xml 또는 servlet-context.xml. 무엇이 혼란을 야기 했는가? 봄 샘플 코드에서 어디에서 무엇을 놓을 지에 대한 주제에 대한 어떠한 문서도 보지 못했기 때문에 나는 종종 샘플들 사이의 다른 상황에서 정의 된 것과 똑같은 것을 보았다.사용할 스프링 컨텍스트를 어떻게 결정할 수 있습니까? 봄/MVC와

대개는 루트 컨텍스트에서 서비스 또는 구성 요소 인 것을 정의했으며 웹 컨트롤러, 인터셉터 및 웹에만 관련된 모든 것에 대한 서블릿 컨텍스트를 예약했습니다.

하지만 보안은 어떻습니까? 나는 현재 이것을 루트 컨텍스트의 include로 정의했지만 이것이 맞습니까?

는 웹 컨텍스트가 실제로 응용 프로그램 루트 컨텍스트의 하위 컨텍스트 것을 바로 내 이해 I을 있습니까?

왜 웹 컨텍스트가 분리되어 있어야합니까?

내가 몇 년 전에 3.0에서 스프링 설명서를 참조했지만이 특정 아무것도 기억할 수없는, 나 또한 액션의 봄, 제 3 판은 읽었습니다. 나는이 주제를 둘러싸고있는 모든 자료를 좋아할 것이다. 그냥 web.xml 파일에 DispatcherServlet을을 지정할 때 기본적으로

답변

1

하고는 일반적으로 차이입니다.

기본적으로 applicationContext.xml은 루트 컨텍스트이며 서비스 및 데이터 계층 Bean이있는 곳입니다.

  • DispatcherServlet
  • 가 항상 곁에 WebApplicationContext 콩 공장
  • 있습니까 (또한 WebApplicationContext 될 수있는) 루트 컨텍스트의 자녀 관련
  • 유무 :

    *-servlet.xml 또는 webmvc-config.xml는 점에서 특별하다

하지만 가장 큰 이유는 단위 테스트, 프런트 엔드의 디커플링 백엔드에서, 별도의보기 확인자 및/또는 다중 디스패처 서블릿에 사용됩니다.

서비스 계층을 테스트하기위한 빈을 적게로드하므로 단위 테스트에 적합합니다. 나는 보통로드 아래 내 의견에 명시된 바와 같이 내 진짜 applicationContext.xml 같은 : 그래서 잠시

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

: 서블릿 컨텍스트 디스패처 서블릿이 필요

@ContextConfiguration(locations = "classpath:/META-INF/spring/applicationContext.xml") 

또한 때문에 당신이 같은 서블릿으로 등록해야 디스패처 서블릿이 해당 컨텍스트를 제어하지 않는 한 실제로 등록되지 않은 루트 컨텍스트로 MVC Controller Bean을로드 할 수 있습니다. 이론적으로는 DispatcherServlet이 classpath에 configs를로드 할 수 있다고 생각하지만 contextConfigLocation 값이 classpath에 없다는 것을 알 수 있습니다.

또한 일반적으로 하나의 해결 자 체인 (보기, 로케일, 테마 등) 만 가질 수 있다는 점에서 일부 디스패처 서블릿은 일부 제한 사항 때문에 필요합니다.

+0

흥미 롭다. 나는 당신이'@ ContextConfiguration'으로 봄용 테스트 컨텍스트를 만들어야한다고 생각했다. 내 테스트 컨텍스트에서'applicationContext.xml'이 정상적으로 포함될 수 있다고 가정합니다. 필자는 보통 전용 컨피규레이션의 특정 구현을 사용하여 내 컨텍스트에' '을 넣을 뿐이므로 테스트 컨텍스트에서 필요한 구성 요소 만 포함 할 수 있습니다. 그래서 당신은 그것이 역사라고 말합니까? 이제 더 이상 서블릿 컨텍스트가 더 이상 필요하지 않습니까? 여전히 구성이 필요하지만 비워 두어야합니까? 이 문맥을 갖지 않는 것이 유익합니까? –

+0

예 실제 단위 테스트를위한'applicationContext.xml'을 실제로 사용하고 환경에 기반한 올바른 변수 (예 : dev vs production vs production)를 저장하는'PropertyPlaceholderConfigurer'에 의존합니다. –

1

<servlet-name>.context.xml를 확인합니다. contextConfigLocation을 지정한 경우 param 값을 지정하면 기본적으로 applicationContext.xml을 확인한 다음 특정 파일을 확인합니다. 당신이 다음 사용자 정의 구성 메타 데이터에 대한 검사는 contextConfigLocation을 지정하는 경우, 당신은 아무것도 지정하지 않은 경우

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

당신은 그 때의 ApplicationContext를 확인 <servlet-name>.context.xml 이외의 파일을 지정하기 위해 먼저 수신기를 지정해야합니다.

+0

내 질문에 오해 한 것 같습니다. 웹 컨텍스트 위치 및 구성 파일을 재정의하는 방법을 알고 있습니다. 내가 요청하는 것은 spring/mvc 어플리케이션에 존재하는 두 개의 서로 다른 상황에 관련된 정보이다. –

+0

나는 그것을 알지 못하지만 두 개의 서로 다른 파일이나 두 개의 다른 applicationContext를 의미하는지 확인해야합니까? 매우 무거운 물체이므로 응용 프로그램에 둘 이상이 존재하지 않아야합니다. 또는 두 응용 프로그램 컨텍스트가있는 방법을 잘 모르겠습니다. –

+0

예제에서'ContextLoaderListener'에 대한 컨텍스트 설정을 정의 했으므로'DispatcherServlet'에 대한 컨텍스트 설정도 정의해야합니다. 'ContextLoaderListener'는 루트 컨텍스트이고,'DispatcherServlet'은 웹 컨텍스트입니다. –

1

우리는 왜 분리로 웹 컨텍스트를 필요합니까?

그렇지 않습니다. 사실, 모든 것을 함께 묶어 버리는 공식 스프링 예제가 몇 가지 있습니다.

으로 구분해야하는 몇 가지 이유가 있습니다. 아마도 가장 유효한 것은 유지 보수성입니다. 소스 파일이 작을수록 (설정 파일이 원본 일수록) 이해하기가 더 쉽습니다. 또 다른 이유는 주어진 백엔드가 여러 프런트 엔드에서 사용될 수 있기 때문입니다.

저는 개인적으로 프론트 엔드와 백 엔드를 분리하고 단순히 내가 사용하고있는 백엔드에 대한 컨텍스트를 가져 와서 응용 프로그램 컨텍스트를 구성한다는 생각을 좋아합니다. 그러면 하나의 "서블릿"컨텍스트 파일이 남게됩니다.

관련 문제