[F-Lab 모각코 챌린지] 26일차 - Spring ApplicationContext

F-Lab 모각코 챌린지 26 일차 - 토비의 스프링 책을 공부하며 얻은 인사이트를 정리했습니다.

[F-Lab 모각코 챌린지] 26일차 - Spring ApplicationContext

Spring IoC

ApplicationContext

Spring framework 에서 오브젝트의 생성과 관계설정, 사용, 제거를 제공하는 독립된 컨테이너

  • 우리가 직접 new 키워드를 사용하지 않아도 설정 정보를 바탕으로 생성을 알아서 해준다

Spring 의 IoC 컨테이너는 일반적으로 ApplicationContext 를 말함
(ApplicationContext 는 BeanFactory 의 하위 인터페이스를 구현하고 있으므로)

IoC 컨테이너를 자바 애플리케이션 에서 사용하기 위해서는 ApplicationContext 의 구현체를 사용하면 된다

  • ClassPathXmlApplicationContext
    클래스패스(classpath) 상에 위치한 XML 파일에서 빈 정의를 읽어와 컨테이너를 생성한다.
  • FileSystemXmlApplicationContext
    파일 시스템에서 지정된 경로에 위치한 XML 파일에서 빈 정의를 읽어와 컨테이너를 생성한다.
  • AnnotationConfigApplicationContext
    자바 어노테이션 기반의 설정 정보를 사용하여 빈 정의를 읽어와 컨테이너를 생성한다.
  • GenericApplicationContext
    단일 내부 DefaultListableBeanFactory 인스턴스를 보유하고 있으며, 특정 bean 정의 형식을 가정하지 않는 일반 ApplicationContext 구현. Bean 정의 리더를 적용할 수 있도록 BeanDefinitionRegistry 인터페이스를 생성자로 받는다.
  • StaticApplicationContext
    외부 구성 소스에서 bean 정의를 읽는 대신 bean 및 메시지의 프로그래밍 방식 등록을 지원하는 ApplicationContext 구현. 주로 테스트에 유용하다.

BeanDefinition

IoC 에서 관리하는 Object 는 bean 이라고 부르는데,
설정에 필요한 메타 정보는 BeanDefinition 라고 하며 인터페이스로 표현되는 추상 정보이다.

BeanDefinition 의 메타 정보를 담은 Object 를 사용 하여 IoC 와 DI 를 수행한다

아래는 BeanDefinition 인터페이스의 간단한 내부 구현

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
  String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
  String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
  int ROLE_APPLICATION = 0;
  int ROLE_SUPPORT = 1;
  int ROLE_INFRASTRUCTURE = 2;
  
  ...
}
  
  • SCOPE_SINGLETON
    싱글톤 범위를 나타내는 상수
    싱글톤으로 설정 될 경우 한 개의 인스턴스만 생성되고 공유된다
  • SCOPE_PROTOTYPE
    프로토타입 범위를 나타내는 상수
    프로토타입으로 설정 될 경우 매번 요청할 때마다 새로운 인스턴스가 생성된다
  • ROLE_APPLICATION
    애플리케이션 역할을 나타내는 상수
    주요 애플리케이션 구성 요소로서 사용된다
  • ROLE_SUPPORT
    지원 역할을 나타내는 상수
    주로 애플리케이션 역할을 지원하는 데 사용
  • ROLE_INFRASTRUCTURE
    인프라스트럭처 역할을 나타내는 상수
    스프링 프레임워크의 내부 구조에 사용되는 빈들을 지정 한다

Method 목록

이러한 메소드 들은 실제 BeanDefinition 을 구현 하거나 사용 할 때 요긴하게 참고할 수 있는 목록 이므로 첨부한다.

  • String parentName (setter/getter)
    빈이 상속하는 부모 빈의 이름을 조작한다.
  • String beanClassName (setter/getter)
    빈의 클래스 이름을 조작한다.
    빈의 이름은 빈을 생성할 때 해당 setter 메서드를 이용하여 생성된다
  • String factoryBeanName (setter/getter)
    팩토리 빈의 이름을 조작한다.
    팩토리 빈을 통해 빈을 생성하는 경우 사용된다.
    팩토리 빈은, 빈의 구조에 따라 다른 팩토리 빈을 사용할 수 있다.
  • String factoryMethodName (setter/getter)
    팩토리 메서드의 이름을 조작한다
    위의 factoryBeanName 의 setter 를 통해 지정 된 팩토리 빈을 통해 빈을 생성하는 경우 사용된다
  • String scope (setter/getter)
    빈의 스코프를 조작한다. ( singleton, prototype)
  • boolean isSingleton()
    빈의 싱글톤 여부를 반환한다.
  • boolean isPrototype()
    빈의 프로토타입 여부를 반환한다.
  • boolean isAbstract()
    빈이 추상적인지 여부를 반환한다. 추상 빈은 직접 인스턴스화되지 않는다.
  • int getRole()
    빈의 역할을 반환한다. (ROLE_APPLICATION, ROLE_SUPPORT, ROLE_INFRASTRUCTURE)
  • boolean lazyInit (setter/getter)
    빈의 지연 초기화 여부를 조작한다.