본문 바로가기
강의 정리/스프링 핵심 원리 - 기본편

2. 스프링 컨테이너와 스프링 빈

by 이석준석이 2020. 12. 13.

1. 스프링 컨테이너 (ApplicationContext) 생성 과정

ApplicationContext ac = 
	new AnnotationConfigApplicationContext(AppConfig.class);

 

1. AppConfig라는 클래스에 @Configuration 어노테이션이 붙어있다면, 이를 통해서 스프링 컨테이너를 생성할 수 있다.

 

스프링 컨테이너 구조

2. 생성이 된 이후, AppConfig 내의 @Bean 어노테이션이 있는 빈들을 등록한다.

3. 스프링컨테이너가 빈 사이의 설정관계를 기초로하여 의존관계를 부여한다.

 

스프링은

  • 빈 생성과, 빈 의존관계 주입의 단계가 나눠져있다.
    • 먼저 빈 생성을 다 한뒤,
    • 의존관계를 주입한다.

자바코드는

  • 인스턴스를 생성하면 그 인스턴스 생성 함수 블록을 한번에 처리하기 때문에
    • 인스턴스 생성과, 의존관계 주입을 한번에 한다.

 


2. 빈 조회

  • ac.getBean("빈 이름", 타입.class)
    • 없다면, NoSuchBeanDefinitionException.class 발생
    • 동일한 타입이 두 개 이상이라면 NoUniqueBeanDefinitionException.class 발생
      • 빈 이름을 지정하도록 하자.
  • ac.geteBeans(타입.class)
    • 해당 타입의 모든 빈들을 조회한다.

 

상속관계가 있다면?

  • 자식 타입도 함께 조회된다. 
    • 따라서 Object 타입으로 조회하면, 모든 스프링 빈을 조회한다.
    • .class 타입 기반 instanceOf를 써서 그러는 듯?

3. BeanFactory 와 ApplicationContext

 

BeanFactory

  • 스프링 컨테이너의 최상위 인터페이스이다.
  • 스프링 빈을 관리하고, 조회하는 역할을 담당
    • getBean()

ApplicationContext

  • BeanFactory 의 기능을 모두 상속받아 사용한다.
  • BeanFactory 와의 차이는?
    • + 부가기능
public interface ApplicationContext extends EnvironmentCapable, 
		ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
  • MessageSource 
    • 국제화 기능
  • EnvironmenCapable
    • 로컬 / 개발 / 운영 등을 구분해서 환경 변수를 처리
  • ApplicationEventPublisher
    • 이벤트를 발행하고, 구독하는 모델을 편리하게 지원
  • ResourceLoader
    • 파일, 클래스패스, 외부 등에서 리소스를 편하게 조회할 수 있도록 함

BeanFactory / ApplicationContext = 스프링 컨테이너


4. 스프링 빈 설정 메타 정보 - BeanDefinition

 

스프링은 어떻게 다양한 형식 (Xml, Java) 으로 빈을 등록하도록 하는 것인가?

  • BeanDefinition : 빈 설정 메타정보라 한다.

스프링 컨테이너는 BeanDefinition 추상화에 의존한다.

  • BeanDefinition 내에 빈 등록은 ApplicationContext 의 구현체 (Annotation, GenericXmlApplicationContext) 내부에서 진행된다.
    • 해당 구현체 내부에 (...BeanDefinitionReader) 가 존재한다.

'강의 정리 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글

7. 빈 스코프  (0) 2020.12.24
6. 빈 생명주기 콜백  (0) 2020.12.23
4. 컴포넌트 스캔  (0) 2020.12.17
3. 싱글톤 컨테이너  (0) 2020.12.15
1. 객체지향 설계와 스프링  (0) 2020.12.12