[그림] 전에 썼던 web.xml에 context 설정


[1]스프링 어플리케이션에 application context는 2개가 들어간다.

- ContextLoaderListener에 의해서 만들어지는 Root WebApplicationContext
- DispatcherServlet에 의해서 만들어지는 WebApplicationContext

1. Root WebApplicationContext 이름 그대로 최상단에 위치한 Context 이다
1.1서비스 계층이나 DAO를 포함한, 웹 환경에 독립적인 빈들을 담아둔다.
1.2서로 다른 서블릿컨텍스트에서 공유해야 하는 빈들을 등록해놓고 사용할 수 있다.
1.3Servlet context에 등록된 빈들을 이용 불가능하고 servlet context와 공통된 빈이 있다면 servlet context 빈이 우선된다.
1.4WebApplication 전체에 사용가능한 DB연결, 로깅 기능들이 이용된다.

2. WebApplicationContext 서블릿에서만 이용되는 Context이다
2.1DispatcherServlet이 직접 사용하는 컨트롤러를 포함한 웹 관련 빈을 등록하는 데 사용한다.
2.2DispatcherServlet은 독자적인 WebApplicationContext를 가지고 있고, 모두 동일한 Root WebApplicationContext를 공유한다.


[2]WebApplicationContext 객체 얻어내기

Java 0.41 KB
  1. //접근 방법1
  2. public class A  {
  3.     @Autowired
  4.     WebApplicationContext applicationContext;
  5.    
  6.     //Container 내에 객체얻기
  7.     public method() {
  8.         B b = context.getBean(B.class);    
  9.     }
  10. }
  11.  
  12.  
  13. //접근 방법2
  14. public class A implements ApplicationContextAware {
  15.   private ApplicationContext context;
  16.  
  17.   public void setApplicationContext(ApplicationContext context) {
  18.       this.context = context;
  19.   }
  20. }


실제 코드상에서 WebApplicationContext 객체를 얻어낼 방법은 다양하다.

그 중 위와같은 예가 가장 흔하게 쓰이는 예이다.

컨테이너 내의 Bean은 Singleton 이므로 Static 속성과 유사하게 사용될 수 있다.

예시) 객체 내에 설정값 변수를 선언하여 어느 객체에서든지 참조 가능하다.


-------------------추가 좋은글-----------------
*WebAppliCationContext vs ApplicationContext

 스프링에서 말하는 "애플리케이션 컨텍스트"는 스프링이 관리하는 빈들이 담겨 있는 컨테이너라고 생각하시면 됩니다. 스프링 안에는 여러 종류의 애플리케이션 컨텍스트 구현체가 있는데, ApplicationContext라는 인터페이스를 구현한 객체들이 다 이 애플리케이션 컨텍스트입니다. 웹 애플리케이션 컨텍스트는 ApplicationContext를 확장한 WebApplicationContext 인터페이스의 구현체를 말합니다. WebApplicationContext는 ApplicationContext에 getServletContext() 메서드가 추가된 인터페이스입니다. 이 메서드를 호출하면 서블릿 컨텍스트를 반환됩니다. 결국 웹 애플리케이션 컨텍스트는 스프링 애플리케이션 컨텍스트의 변종이면서 서블릿 컨텍스트와 연관 관계에 있다는 정도로 정리가 됩니다. 이 메서드가 추가됨과 동시에 서블릿 컨텍스트를 이용한 몇가지 빈 생애 주기 스코프(애플리케이션, 리퀘스트, 세션 등)가 추가되기도 합니다.


*Child WAC은 여러개가 생성될수있다.

 이론적으로 DispatcherServlet는 여러 개 등록될 수 있다. 왜 그래야 하는지는.. 생각해보면 많은 이유가 있겠지만, 아무튼 기술적으로 가능하고 그런 의도를 가지고 설계되었다. 그리고 각각 DispatcherServlet은 독자적인 WAC를 가지고 있고 모두 동일한 Root WAC를 공유한다. 스프링의 AC는 ClassLoader와 비슷하게 자신과 상위 AC에서만 빈을 찾는다. 따라서 같은 레벨의 형제 AC의 빈에는 접근하지 못하고 독립적이다.


출처

https://www.slipp.net/questions/166

http://toby.epril.com/?p=934

+ Recent posts