Skip to content

스프링 컨테이너(Spring Container)

스프링에서 DI를 이용하여 애플리케이션을 구성하는 여러 빈(Bean)들의 생명주기(Lifecycle)와 애플리케이션의 서비스 실행 등을 관리하며 생성된 인스턴스들에게 기능을 제공하는 것을 부르는 말이다. 프로그래머의 개입 없이도 컨테이너에 설정된 내용에 따라 빈을 알아서 참조하고 관리한다. 대표적으론 BeanFactory와 ApplicationContext 가 있다.

BeanFactory

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

ApplicationContext

BeanFactory 기능을 모두 상속받아서 제공한다. 빈을 관리하고 조회하는 기능 말고도 환경변수를 처리하는 기능, 메시지를 국제화해주는 기능, 리소스를 편리하게 조회할 수 있게 하는 기능 등등의 부가기능도 함께 구현되어있다.

BeanDefinition

BeanDefinition은 빈 설정 메타정보인데, 스프링은 이 인터페이스를 통해 다양한 설정 형식을 지원한다. @Bean, 당 각각 하나씩 메타 정보가 생성되고 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다. BeanDefinition는 reader로 코드를 직접 스캔해서 메타 정보를 만들어준다.

  • AnnotationConfigApplicationContext 는 AnnotatedBeanDefinitionReader 를 사용해서 AppConfig.class 를 읽고 BeanDefinition 을 생성한다.
  • GenericXmlApplicationContext 는 XmlBeanDefinitionReader 를 사용해서 appConfig.xml 설정 정보를 읽고 BeanDefinition 을 생성한다.

BeanDefinition 정보

  • Scope: 싱글톤(기본값)
  • lazyInit: 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때 까지 최대한 생성을 지연처리 하는지 여부
  • InitMethodName: 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
  • DestroyMethodName: 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명

팩토리 메서드 등록이 아닐때만 사용

  • BeanClassName: 생성할 빈의 클래스 명
  • Constructor arguments, Properties: 의존관계 주입에서 사용한다.

팩토리 메서드 등록에서만 사용

  • factoryBeanName: 팩토리 역할을 수행하는 빈의 이름
  • factoryMethodName: 빈을 생성할 팩토리 메서드 지정