프로그래밍/Spring Framework

Spring Web ApplicationContext 갖고 오기

말춘이 2020. 2. 22. 00:16
반응형

  Spring Framework 기반의 애플리케이션에선 bean 객체를 갖고 오기 위해 GenericApplicationContext 설정, 참조한다.
그렇게 생성된 context 객체의 getBean 메소드를 통해 원하는 bean 객체를 참조할 수 있다.

  스프링 기반의 웹 어플리케이션에선 bean 객체를 갖고 오기 위해 어떻게 context 객체를 참조해야 할까?

 

  스프링 기반의 웹 어플리케이션을 만들기 위해 web.xml에 리스너를 생성해준다.
  org.springframework.web.context.ContextLoaderListener 클래스이다.
  ContextLoaderListener 이 클래스는 org.springframework.web.context.ContextLoader 클래스를 상속받아 구현된 것이다.
  ContextLoader 클래스의 configureAndRefreshWebApplicationContext 메서드에서 다음과 같은 부분이 있다.

configLocationParam = sc.getInitParameter("contextConfigLocation");

  web.xml을 통해 ServletContext initParameter로 등록해주는 이유이기도 하다. 바로 bean 설정을 참조하기 위해서이다.

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

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

  그럼 ContextLoaderListener 통해 만들어진 콘텍스트를 어떻게 참조해야 할까?
  정답은 ContextLoaderListener 클래스가 상속받고 있는 ContextLoader 클래스에 있다.

  org.springframework.web.context.ContextLoader 312줄에 정의된 메서드의 내용을 보면,

public static WebApplicationContext getCurrentWebApplicationContext() {
    ClassLoader ccl = Thread.currentThread().getContextClassLoader();
    if (ccl != null) {
        WebApplicationContext ccpt = (WebApplicationContext)currentContextPerThread.get(ccl);
        if (ccpt != null) {
            return ccpt;
        }
    }
 
    return currentContext;
}

  currentContextPerThread 전역 변수(Map<ClassLoader, WebApplicationContext>)에 보관하고 있던 클래스 로더를 key값으로 WebApplicationContext를 반환하여 준다. 이 WebApplicationContext 통해 원하는 Bean 객체를 getBean 메서드를 이용하여 참조할 수 있다.

 

- 예제

WebApplicationContext context = ContextLoaderListener.getCurrentWebApplicationContext();
this.indexDataDAO = context.getBean("indexDataDAO", IndexData.class);

 

반응형