ApplicationContext 를 스프링 컨테이너라고 하며, ApplicationContext는 인터페이스이다.
스프링 컨테이너는 XML을 기반으로 만들 수 있고, 애노테이션 기반의 자바 설정 클래스로 만들 수 있다.
자바 설정 클래스: AnnotationConfigApplicationContext를 ApplicationContext의 구현체로 사용
XML: GenericXmlApplicationContext를 ApplicationContext의 구현체로 사용
스프링 컨테이너 생성 과정
스프링 컨테이너 생성과정
스프링 컨테이너 생성: 스프링 컨테이너(ApplicationContext)를 생성할 때에는 구성 정보를 지정해주어야 한다. 위 그림에서는 자바 클래스를 구성 정보로 지정했다. (new AnnotationConfigApplicationContext(AppConfig.class)
스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록한다. (AppConfig.class를 읽어 스프링 빈을 등록)
빈 이름은 기본적으로 메서드 이름을 사용하며 직접 부여할수도 있다.
빈 이름은 항상 다른 이름을 부여해야 한다. 같은 이름을 부여하면 다른 빈이 무시되거나 기존 빈을 덮어버리는 등 설정에 따라 오류가 발생한다.
스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI)한다.
BeanFactory와 ApplicationContext
BeanFactory와 ApplicationContext
BeanFactory
스프링 컨테이너의 최상위 인터페이스이며, 스프링 빈을 관리하고 조회하는 역할을 담당한다.
getBean() 제공
ApplicationContext
BeanFactory 기능을 모두 상속받아 제공하고 기타 부가기능을 제공한다
BeanFactory를 직접 사용할 일은 거의 없으며, 부가기능이 포함된 ApplicationContext를 사용한다.
BeanFactory나 ApplicationContext를 스프링 컨테이너라고 한다.
부가기능
메시지 소스를 활용한 국제화 기능(한국 접속 시 한국어, 영어권 접속시 영어로 출력)
환경변수: 로컬, 개발, 운영 등을 구분해서 처리
애플리케이션 이벤트: 이벤트 발행 및 구독 모델 편리하게 지원
편리한 리소스 조회: 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회
스프링 컨테이너는 자바코드, XML 등 다양한 형식의 설정 정보를 받아들일 수 있게 유연히 설계되어 있다.
BeanDefinition
ApplicationContext와 BeanDefinition
스프링은 BeanDefinition이라는 추상화를 통하여 다양한 설정 형식을 지원한다.
BeanDefinition을 빈 설정 메타정보라고 하며, @Bean, 당 각각 하나씩 메타정보가 생성된다
스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.
역할과 구현의 분리: 스프링 컨테이너는 설정 정보가 자바 코드인지, XML인지 몰라도 된다. BeanDefinition만 알면 된다. BeanDefinition을 통해 읽은 메타정보를 기반으로 스프링 빈을 생성하기 때문이다.
BeanDefinition 정보
BeanClassName: 생성할 빈의 클래스 명(Factory 역할의 빈 사용 시 null)
factoryBeanName: 팩토리 역할의 빈 이름 (예: AppConfig)
factoryMethodName: 빈을 생성할 팩토리 메서드 지정 (예: memberService)
Scope: 빈 스코프. 미 지정시 싱글톤이 기본값
lazyInit: 스프링 컨테이너 생성 시 빈을 생성하는 것이 아닌 실제 빈을 사용할 때까지 생성을 지연할 것인지 여부
InitMethodName: 빈을 생성하고 의존관계를 적용한 뒤 호출되는 초기화 메서드 명
DestroyMethodName: 빈 생명주기가 종료되어 제거하기 직전 호출되는 메서드 명
Constructor arguments, Properties: 의존관계 주입 시 사용(XML의 , 등 / Factroy 역할의 빈 사용 시 null)
정리
BeanFactory 혹은 ApplicatonContext를 스프링 컨테이너라고 하며, ApplicationContext는 BeanFactory를 상속받는다.
'스프링 컨테이너'라고 하면 주로 ApplicationContext를 지칭하며, ApplicationContext는 BeanFactory의 기능+부가기능을 제공한다