스프링 IoC 컨테이너
- 의존성 주입(DI)를 이용하여 애플리케이션을 구성하는 컴포넌트를 관리함.
- 협력하는 컴포넌트 간의 연관관계를 형성함.
org.springframework.beans와 org.springframework.context 패키지는 스프링 프레임워크 IoC 컨테이너의 기반임.
참고
- IoC / DI와 관련해서는 이곳을 참고할 것
애플리케이션 컨텍스트(ApplicationContext)
- org.springframework.context.ApplicationContext 인터페이스
- BeanFactory의 서브 인터페이스임.
- 더 쉬운 통합을 제공함.
- 스프링의 AOP 기능
- 국제화(i18n, internationalization)를 위한 메시지 리소스 핸들링
- 이벤트 발행(event publication)
- 애플리케이션 레이어 특정 컨텍스트(예. 웹 애플리케이션을 위해 WebApplicationContext 사용)
빈 팩토리(BeanFactory)
- org.springframework.beans.factory.BeanFactory 인터페이스
- 어떤 타입의 객체도 관리할 수 있는 향상된 설정 메커니즘을 제공함.
BeanFactory or ApplicationContext?
- 특별한 이유가 없는 한 애플리케이션 컨텍스트를 사용할 것을 권장함. [1]
기능 | BeanFactory | ApplicationContext |
---|---|---|
빈 인스턴스화/와이어링 | Yes | Yes |
자동 BeanPostProcessor 등록 | No | Yes |
자동 BeanFactoryPostProcessor 등록 | No | Yes |
편리한 MessageSource 접근(i18n을 위한) | No | Yes |
ApplicationEvent 발행(publication) | No | Yes |
ApplicationContext
- org.springframework.context.ApplicationContext 인터페이스는 스프링 IoC 컨테이너를 나타내며, 빈(스프링 빈)을 인스턴스화하고, 설정하고, 조합하는 데 책임이 있음.
- 컨테이너는 어떤 객체를 인스턴스로 만들고 설정하고 조합해야 하는지를 설정 메타데이터에서 알아냄.
- 설정 메타데이터는 XML이나 자바 애노테이션, 자바 코드로 나타냄.
- 설정 메타데이터는 애플리케이션을 구성하는 객체들을 나타내고 그러한 객체들 사이의 풍부한 상호 의존성을 나타냄.
- 스프링 빈으로 등록할 클래스 작성(예. POJOs)
- 설정 메타데이터(Configuration Metadata) 작성
- 스프링 컨테이너(예. ApplicationContext)가 설정 메타데이터 내용을 기반으로 스프링 빈을 인스턴스화하고, 설정을 완료함
- 실행가능한 시스템이나 애플리케이션이 준비됨
대표적인 ApplicationContext 구현체
클래스 | 모듈 | 버전 | 설명 |
---|---|---|---|
AnnotationConfigApplicationContext | spring-context | 3.0 | 하나 이상의 자바 기반 설정 클래스에서 스프링 애플리케이션 컨텍스트를 로드함. |
AnnotationConfigWebApplicationContext | spring-web | 3.0 | 하나 이상의 자바 기반 설정 클래스에서 스프링 웹 애플리케이션 컨텍스트를 로드함. |
ClassPathXmlApplicationContext | spring-context | 1.0 | 클래스패스(classpath)에 위치한 XML 파일에서 컨텍스트 정의 내용을 로드함. |
FileSystemXmlApplicationContext | spring-context | 1.0 | 파일 시스템에서, 즉 파일 경로로 지정된 XML 파일에서 컨텍스트 정의 내용을 로드함. |
XmlWebApplicationContext | spring-web [2] | 1.0 | 웹 애플리케이션에 포함된 XML 파일에서 컨텍스트 정의 내용을 로드함. |
[1] ^ http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#context-introduction-ctx-vs-beanfactory
[2] ^ 스프링 프레임워크 1.0부터 존재했으며, 스프링 프레임워크 3.0에서 spring-web 모듈로 분리되었음. 여기를 참조할 것.