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

스프링 컨테이너 생성

//스프링 컨테이너 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
  • ApplicationContext
    • 스프링 컨테이너라고 함
    • 인터페이스임
    • XML 또는 애노테이션 기반의 자바 설정 클래스로 만들 수 있음
  • 스프링 컨테이너 생성 과정
    1. 스프링 컨테이너 생성
    2. 스프링 빈 등록
      • 빈 이름은 메서드 이름을 사용
      • 빈 이름을 직접 부여 가능
        • ex) @Bean(name="memberService2")
    3. 스프링 빈 의존관계 설정 - 준비
    4. 스프링 빈 의존관계 설정 - 완료
      • 스프링 컨테이너는 설정 정보를 참고하여 의존관계를 주입(DI)
  • 스프링 컨테이너 생성 과정 그림

1. 스프링 컨테이너 생성
2. 스프링 빈 등록
3. 스프링 빈 의존관계 설정 - 준비
4. 스프링 빈 의존관계 설정 - 완료

컨테이너에 등록된 모든 빈 조회

// 테스트 코드

 

  • 모든 빈 조회
    • ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회한다.
    • ac.getBean() : 빈 이름으로 빈 객체(인스턴스)를 조회한다.
  • 단축키
    • iter + Tab: for 문 자동 완성
    • soutm: 메서드명 출력
    • soutv: 변수명 출력

스프링 빈 조회 - 기본

  • ac.getBean(빈 이름, 타입)
  • ac.getBean(타입)

// 테스트 코드

  • 단축키
    • command + e: 이전 파일로 가기 (최근 파일)

스프링 빈 조회 - 동일 타입 둘 이상

  • 타입으로 조회시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생
  • 이때는 빈 이름을 지정하자. ac.getBeansOfType() 을 사용하면 해당 타입의 모든 빈을 조회할 수 있다.

// 테스트 코드

 

스프링 빈 조회 - 상속 관계

  • 부모 타입으로 조회하면, 자식 타입도 함께 조회

BeanFactory 와 ApplicationContext

BeanFactory

  • 스프링 컨테이너의 최상위 인터페이스
  • 스프링 빈을 관리하고 조회하는 역할을 담당
  • getBean() 을 제공
  • 지금까지 우리가 사용했던 대부분의 기능은 BeanFactory가 제공하는 기능

ApplicationContextBeanFactory 

    • BeanFactory 기능을 모두 상속받아서 제공
    • 그 외 수많은 부가 기능 제공

  • 메시지 소스를 활용한 국제화 기능
    • ex) 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력
  • 환경변수
    • 로컬, 개발, 운영 등을 구분해서 처리
  • 애플리케이션 이벤트
    • 이벤트를 발행하고 구독하는 모델을 편리하게 지원
  • 편리한 리소스 조회
    • 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회

정리

  • ApplicationContext는 BeanFactory의 기능을 상속 받음
  • ApplicationContext는 빈 관리 기능 + 편리한 부가 기능을 제공
  • BeanFactory를 직접 사용할 일은 거의 없고 부가기능이 포함된 ApplicationContext를 사용
  • BeanFactory나 ApplicationContext를 스프링 컨테이너라고 함

다양한 설정 형식 지원 - 자바 코드, XML

  • 애노테이션 기반 자바 코드 설정
    • new AnnotationConfigApplicationContext(AppConfig.class)
  • XML 설정
    • new GenericXmlApplicationContext(AppConfig.xml)

// xml 예제 코드

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

  • 스프링은 어떻게 다양한 설정 형식을 지원하는 것일까? => 핵심은 BeanDefinition 이라는 추상화!
  • 쉽게 이야기해서 역할과 구현을 개념적으로 나눈 것이다!
    • XML을 읽어서 BeanDefinition을 만들면 된다.
    • 자바 코드를 읽어서 BeanDefinition을 만들면 된다.
    • 스프링 컨테이너는 자바 코드인지, XML인지 몰라도 된다. 오직 BeanDefinition만 알면 된다.
  • BeanDefinition 을 빈 설정 메타정보라 한다.
    • @Bean , <bean> 당 각각 하나씩 메타 정보가 생성된다.
  • 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.

 

// 예제 코드

+ Recent posts