스프링 컨테이너(ApplicationContext)
ApplicationContext를 스프링 컨테이너라 하는데, 이번에는 ApplicationContext의 구현체들과 ApplicationContext의 부모 interface인 BeanFactory에 대해 알아보려 한다.
BeanFactory
- BeanFactory는 ApplicationContext의 상위 인터페이스다.
- 스프링 컨테이너의 최상위 인터페이스로서 스프링 빈을 관리하고 조회하는 역할을 담당한다.
- BeanFactory는 ApplicationContext의 부모 인터페이스로 기본적인 IoC container 기능을 제공한다.
public interface BeanFactory {
Object getBean(String name) throws BeansException;
Object getBean(String name) throws BeansException;
// ...
}
- 위의 코드는 BeanFactory의 일부를 가져온건데, 우리가 지금까지 ApplicationContext를 이용해서 getBean을 통해 조회했던 메서드는 BeanFactory가 제공하는 기능이다.
ApplicationContext
- ApplicationContext는 BeanFactory를 상속받은 인터페이스로 기본적인 IoC container 기능 + 추가적인 기능들을 제공하는데, 해당 하는 기능들은 다음과 같다.
- 메시지소스 기능
- Locale에 따라 다양한 언어 지원을 편리하게 해주는 기능
- 환경변수
- 로컬, 개발, 운영 환경을 구분해서 처리할 수 있다.
- 리소스 조회
- 파일, 클래스패스 등의 리소스를 편리하게 조회할 수 있게 해준다.
- 애플리케이션 이벤트
- 이벤트 발행/구독 모델을 편리하게 지원한다.
위의 기능들은 ApplicationContext의 코드를 보면 알 수 있다.
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
@Nullable
String getId();
String getApplicationName();
String getDisplayName();
long getStartupDate();
@Nullable
ApplicationContext getParent();
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
정리하자면 ApplicationContext는 BeanFactory를 상속받아 스프링 컨테이너의 기능과 더불더 메시지소스와 같은 애플리케이션에 필요한 다양한 기능들을 추가적으로 제공해준다.
ApplicationContext의 다양한 구현체
- 보통 빈을 등록할 때 애노테이션을 활용하는데, xml 등의 방법으로도 빈을 등록할 수 있는 방법이 있다.
- 그래서 스프링은 다양한 방식으로 ApplicationContxet를 구성할 수 있는 다양한 구현체를 만들어 두었다.
- AnnotationConfigApplicationContext.class
- GenericXmlApplicationContext.class
- etc…
스프링은 다양한 설정 형식들을 적용할 수 있도록 구현해놨는데, 그건 BeanDefinition이라는 한단계 더 추상화를 했기 때문에 가능하다.
즉, ApplicationContext의 각 구현체들은 Annotation 또는 XML로 읽어들인 설정들을 BeanDefinition으로 만들어서 반환하고 Spring Container는 이 BeanDefinition으로 컨테이너를 구성한다.