Spring MVC에서 ApplicationContext와 WebApplicationContext의 차이점은 무엇입니까?


193

응용 프로그램 컨텍스트와 웹 응용 프로그램 컨텍스트의 차이점은 무엇입니까?

WebApplicationContextSpring MVC 아키텍처 지향 응용 프로그램에 사용되는 것을 알고 있습니까?

ApplicationContextMVC 응용 프로그램에서 어떤 용도로 사용되는지 알고 싶습니다 . 그리고 어떤 종류의 콩이 정의되어 ApplicationContext있습니까?


5
나는 이것이 stackoverflow.com/questions/3652090/ 의 사본이라고 생각하지 않습니다. 그 질문은 web.xml파일 의 내용에 대해 묻습니다 . 이 질문은 일부 Spring 클래스에 대해 묻습니다.
Raedwald

@Raedwald는 사실이 아닙니다. 다른 질문은 말하지 않고 web.xmlSpring XML bean 구성 변형 ApplicationContext및에 대한 이야기 WebApplicationContext입니다. 의 모든 bean 정의는에서 applicationContext.xml사용할 수있는 ApplicationContext반면의 모든 bean 정의는에서 *-servlet.xml사용할 수 있습니다 WebApplicationContext.
g00glen00b

답변:


228

웹 애플리케이션 컨텍스트 확장 애플리케이션 컨텍스트는 표준 javax.servlet.ServletContext 와 작동하도록 설계되어 컨테이너와 통신 할 수 있습니다.

public interface WebApplicationContext extends ApplicationContext {
    ServletContext getServletContext();
}

WebApplicationContext에서 인스턴스화 된 Bean은 ServletContextAware 인터페이스를 구현하는 경우 ServletContext를 사용할 수도 있습니다.

package org.springframework.web.context;
public interface ServletContextAware extends Aware { 
     void setServletContext(ServletContext servletContext);
}

getResourceAsStream () 메소드를 호출하여 WEB-INF 자원 (xml 구성 등)에 액세스하는 것과 같이 ServletContext 인스턴스와 관련하여 가능한 많은 작업이 있습니다. 일반적으로 서블릿 스프링 애플리케이션에서 web.xml에 정의 된 모든 애플리케이션 컨텍스트는 웹 애플리케이션 컨텍스트이며 이는 루트 웹 애플리케이션 컨텍스트와 서블릿의 애플리케이션 컨텍스트 둘 다로 간다.

또한 웹 응용 프로그램 컨텍스트 기능에 따라 응용 프로그램을 테스트하기가 약간 어려워 질 수 있으며 테스트를 위해 MockServletContext 클래스 를 사용해야 할 수도 있습니다 .

서블릿과 루트 컨텍스트의 차이점 Spring을 사용하면 다중 레벨 애플리케이션 컨텍스트 계층을 빌드 할 수 있으므로 현재 애플리케이션 컨텍스트에없는 경우 필요한 Bean을 상위 컨텍스트에서 가져옵니다. 웹 앱에는 기본적으로 루트 및 서블릿 컨텍스트라는 두 가지 계층 레벨이 있습니다 서블릿 및 루트 컨텍스트.

이를 통해 일부 서비스를 전체 애플리케이션의 싱글 톤 (Spring Security Bean 및 기본 데이터베이스 액세스 서비스가 여기에 상주 함)으로 실행하고 다른 서비스를 해당 서블릿에서 분리 된 서비스로 실행하여 Bean 간의 이름 충돌을 피할 수 있습니다. 예를 들어 한 서블릿 컨텍스트는 웹 페이지를 제공하고 다른 서블릿 컨텍스트는 상태 비 저장 웹 서비스를 구현합니다.

이 두 레벨 분리는 스프링 서블릿 클래스를 사용할 때 즉시 제공됩니다. 루트 애플리케이션 컨텍스트를 구성하려면 web.xml에서 context-param 태그 를 사용해야합니다.

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/root-context.xml
            /WEB-INF/applicationContext-security.xml
    </param-value>
</context-param>

(루트 애플리케이션 컨텍스트는 web.xml에 선언 된 ContextLoaderListener에 의해 작성됩니다.

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener> 

) 및 서블릿 애플리케이션 컨텍스트의 서블릿 태그

<servlet>
   <servlet-name>myservlet</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>app-servlet.xml</param-value>
   </init-param>
</servlet>

init-param이 생략되면, 스프링은이 예제에서 myservlet-servlet.xml을 사용한다는 점에 유의하십시오.

Spring Framework에서 applicationContext.xml과 spring-servlet.xml의 차이점 도 참조하십시오.


2
답변 주셔서 감사합니다. 웹 응용 프로그램에 사용되는 두 가지 유형의 컨텍스트가 있다고 들었습니다. 하나는 웹과 관련되지 않은 정의가 예제 서비스, dao 구성 등으로 제공되는 루트 애플리케이션 컨텍스트 역할을하며 다른 하나는 핸들러 맵핑 등과 같은 웹 특정 구성을위한 루트 애플리케이션 컨텍스트 역할을합니다. . 이 구조를 선언하는 방법을 알고 싶습니다. ContextListener 콜백에 대해 들었습니다. 그러나 나는 그것에 대해 꽤 불분명하다.
Sumit Trehan

1
이러한 구조는 Spring 서블릿 도구에 하드 코딩되어 있으며, 스프링 웹 앱에는 항상 최소한 두 개의 응용 프로그램 컨텍스트가 있습니다. 업데이트 된 답변을 참조하십시오.
Boris Treukhov

우수한 discription .. 나는이 시나리오에 대한 몇 가지 의심이 있었다.. 내가 초기 단계에있어서 약간의 지식을 얻는데 유용한 답변을 찾았습니다 ..
user533

"필요한 Bean이 현재 애플리케이션 컨텍스트에없는 경우 상위 컨텍스트에서 가져옵니다." 어떻게 설명 할 수 있습니까? 웹 애플리케이션 컨텍스트가 루트 애플리케이션 컨텍스트의 Bean에 액세스하는 방법 어떤 예에 연결 하시겠습니까?
anir

14

서블릿 날짜로 돌아가서 web.xml은 하나만 가질 수 <context-param>있으므로 서버가 애플리케이션을로드하고 해당 컨텍스트의 데이터가 모든 자원 (예 : 서블릿 및 JSP)에서 공유 될 때 하나의 컨텍스트 오브젝트 만 작성됩니다. 컨텍스트에 데이터베이스 드라이버 이름이있는 것과 동일하지만 변경되지 않습니다. 비슷한 방식으로 <contex-param>Spring 에서 contextConfigLocation 매개 변수를 선언 하면 하나의 Application Context 객체가 생성됩니다.

 <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>com.myApp.ApplicationContext</param-value>
 </context-param>

애플리케이션에 여러 서블릿을 가질 수 있습니다. 예를 들어 한 가지 방법으로 / secure / * 요청을 처리하고 다른 방법으로 / non-seucre / *를 처리 할 수 ​​있습니다. 이 서블릿 각각에 대해 WebApplicationContext 인 컨텍스트 오브젝트를 가질 수 있습니다.

<servlet>
    <servlet-name>SecureSpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>com.myapp.secure.SecureContext</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>SecureSpringDispatcher</servlet-name>
    <url-pattern>/secure/*</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>NonSecureSpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>com.myapp.non-secure.NonSecureContext</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>NonSecureSpringDispatcher</servlet-name>
    <url-pattern>/non-secure/*</url-patten>
</servlet-mapping>

14

허용되는 답변은 완료되었지만 이에 대한 공식 설명이 있습니다.

WebApplicationContext는 웹 애플리케이션에 필요한 몇 가지 추가 기능이있는 일반 ApplicationContext의 확장입니다. 테마를 해석 할 수 있고 (테마 사용 참조), ServletContext에 대한 링크를 통해 관련 Servlet을 알고 있다는 점에서 일반적인 ApplicationContext와 다릅니다. WebApplicationContext는 ServletContext에 바인딩되어 있으며 RequestContextUtils 클래스에서 정적 메소드를 사용하여 WebApplicationContext에 액세스해야하는 경우 언제든지 찾을 수 있습니다.

Spring 웹 프레임 워크 참조 에서 인용

그런데 서블릿과 루트 컨텍스트는 모두 webApplicationContext입니다.

Spring Web MVC의 일반적인 컨텍스트 계층


좋은 설명입니다.
Shashank

6

ApplicationContext (Root Application Context) : 모든 Spring MVC 웹 애플리케이션에는 컨텍스트 구성의 루트로 구성된 applicationContext.xml 파일이 있습니다. Spring은이 파일을로드하고 전체 애플리케이션에 대한 applicationContext를 작성합니다. 이 파일은 web.xml 파일에서 컨텍스트 매개 변수로 구성된 ContextLoaderListener에 의해로드됩니다. 그리고 웹 응용 프로그램 당 하나의 applicationContext 만 있습니다.

WebApplicationContext : WebApplicationContext는 웹 인식 애플리케이션 컨텍스트입니다. 즉, 서블릿 컨텍스트 정보가 있습니다. 단일 웹 애플리케이션은 여러 개의 WebApplicationContext를 가질 수 있으며 각 Dispatcher 서블릿 (Spring MVC 아키텍처의 프론트 컨트롤러)은 WebApplicationContext와 연관되어있다. webApplicationContext 구성 파일 * -servlet.xml은 DispatcherServlet에 고유합니다. 또한 웹 애플리케이션은 여러 요청을 제공하도록 구성된 둘 이상의 디스패처 서블릿을 가질 수 있으므로 웹 애플리케이션 당 하나 이상의 webApplicationContext 파일이있을 수 있습니다.


3

WebApplicationContext인터페이스에 의해 지정된 웹 애플리케이션 컨텍스트 는 웹 애플리케이션에 대한 스프링 애플리케이션 컨텍스트입니다. WebApplicationContext인터페이스가 인터페이스를 확장 하고 웹 애플리케이션 ApplicationContext의 표준 서블릿 API ServletContext를 검색하는 메소드를 추가 한다는 점을 고려하면 일반 Spring 애플리케이션 컨텍스트의 모든 특성을 갖습니다 .

표준 Spring Bean 범위 singletonprototype에 추가하여 웹 애플리케이션 컨텍스트에서 사용 가능한 세 가지 추가 범위가 있습니다.

  • request-단일 Bean 정의의 범위를 단일 HTTP 요청의 라이프 사이클로 범위 지정합니다. 즉, 각 HTTP 요청에는 단일 Bean 정의의 뒷면에서 작성된 고유 한 Bean 인스턴스가 있습니다.
  • session -단일 Bean 정의의 범위를 HTTP 세션의 라이프 사이클로 범위 지정
  • application -단일 Bean 정의의 라이프 사이클에 범위를 지정합니다. ServletContext
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.