DefaultListableBeanFactory

2024. 10. 18. 16:26Spring Boot/Spring Boot Auto Configuration

DefaultListableBeanFactory스프링 프레임워크의 핵심 클래스 중 하나로, 스프링의 빈 팩토리(BeanFactory)애플리케이션 컨텍스트(ApplicationContext)에서 빈을 정의하고 관리하는 역할을 담당하는 빈 팩토리의 기본 구현체입니다. DefaultListableBeanFactory는 스프링이 빈들을 등록하고 검색하며, 주입하고 관리하는 과정의 중심에 위치한 클래스입니다.

1. 역할 및 특징

DefaultListableBeanFactory는 여러 인터페이스를 구현하여 다양한 기능을 제공합니다. 주로 다음과 같은 특징을 가집니다:

  • BeanFactory의 구현체: 스프링에서 빈을 관리하는 최상위 인터페이스인 BeanFactory의 구현체로서, 빈을 생성하고 관리하는 기능을 제공합니다.
  • ListableBeanFactory: 빈 팩토리 내에 등록된 모든 빈의 목록을 제공할 수 있는 기능을 추가로 구현합니다. 빈 정의에 따라 여러 빈을 등록하고, 검색하며, BeanDefinition을 기반으로 빈을 관리합니다.
  • AutowireCapableBeanFactory: 자동으로 빈을 주입하고, 의존성 주입과 관련된 다양한 메커니즘을 제공합니다.
  • ConfigurableBeanFactory: 팩토리가 상속받는 빈 정의와 스코프 등의 설정을 제공하는 인터페이스를 구현합니다.
  • BeanDefinitionRegistry: 새로운 빈 정의를 등록하거나 기존 빈 정의를 수정할 수 있습니다. 즉, 동적으로 빈 정의를 추가하거나 제거할 수 있습니다.

2. 주요 기능

DefaultListableBeanFactory는 빈 정의의 등록, 빈 인스턴스의 생성 및 의존성 주입을 포함하여 스프링 애플리케이션에서 빈 관리의 여러 핵심 기능을 수행합니다.

2.1 빈 정의 등록 및 관리

DefaultListableBeanFactoryBeanDefinition을 통해 빈 정의를 등록하고 관리합니다. 빈 정의는 빈의 클래스, 라이프사이클 콜백, 스코프, 의존성 등의 정보를 포함하고 있습니다.

빈 정의를 등록하는 메서드는 주로 다음과 같습니다:

  • registerBeanDefinition(String beanName, BeanDefinition beanDefinition): 빈 이름과 빈 정의를 사용하여 새로운 빈 정의를 등록합니다.
beanFactory.registerBeanDefinition("myBean", beanDefinition);

2.2 빈 검색 및 조회

빈을 조회하는 기능도 제공합니다. DefaultListableBeanFactoryListableBeanFactory를 구현하여 여러 빈을 조회하거나 특정 타입의 빈을 검색할 수 있습니다.

빈 검색 메서드들은 다음과 같습니다:

  • getBean(String name): 지정된 이름의 빈을 검색하여 반환합니다.
  • getBeansOfType(Class<?> type): 특정 타입의 모든 빈을 조회하여 반환합니다.
  • containsBeanDefinition(String beanName): 지정된 이름의 빈 정의가 등록되어 있는지 확인합니다.

2.3 의존성 주입 및 자동 주입

DefaultListableBeanFactoryAutowireCapableBeanFactory를 구현하여 의존성 주입을 관리하고, 자동으로 빈을 주입하는 기능을 제공합니다. 이를 통해 빈을 생성할 때, 필요한 다른 빈을 자동으로 주입하거나, 빈 생성 후 주입할 수 있습니다.

자동 주입 기능은 다음과 같이 동작합니다:

  • autowireBean(Object existingBean): 기존 객체에 대해 자동으로 빈을 주입합니다.
  • resolveDependency(): 특정 의존성을 자동으로 주입할 수 있도록 해줍니다.

2.4 스코프 및 라이프사이클 관리

빈의 스코프(싱글톤, 프로토타입 등)를 관리하며, 초기화 및 소멸 메서드와 같은 빈의 라이프사이클을 관리합니다.

  • 싱글톤 빈: 기본적으로 스프링은 빈을 싱글톤으로 관리합니다. DefaultListableBeanFactory는 이러한 싱글톤 빈의 생명주기를 관리합니다.
  • 프로토타입 빈: 프로토타입 빈의 경우 매번 새롭게 빈을 생성하는 로직을 관리합니다.

2.5 계층 구조 관리

DefaultListableBeanFactory는 계층형 빈 팩토리를 지원합니다. 즉, 부모 팩토리를 가질 수 있으며, 부모 팩토리로부터 빈을 검색하거나 상속받을 수 있습니다.

  • setParentBeanFactory(BeanFactory parentBeanFactory): 부모 팩토리를 설정하여 계층 구조를 관리합니다.

3. 구성 요소

DefaultListableBeanFactory는 다양한 내부 데이터 구조와 메서드를 통해 빈을 관리합니다.

  • beanDefinitionMap: 빈 이름을 키로 하고, 해당 빈의 BeanDefinition을 값으로 하는 맵입니다. 모든 등록된 빈의 정의가 여기에 저장됩니다.
  • singletonObjects: 싱글톤 빈 인스턴스들이 저장되는 캐시입니다. 이미 생성된 싱글톤 빈들은 이 맵에 저장되어 이후에는 새로 생성되지 않고 캐시된 객체를 반환합니다.

4. 라이프사이클

DefaultListableBeanFactory는 빈 팩토리의 라이프사이클을 관리합니다. 이는 스프링 애플리케이션이 시작되고 종료될 때 빈의 초기화와 소멸 메서드를 호출하는 과정을 포함합니다. 또한, 필요에 따라 팩토리 빈(FactoryBean) 또는 애플리케이션 이벤트 리스너와 같은 다른 스프링 메커니즘과 통합되어 동작합니다.

5. 확장성

DefaultListableBeanFactory는 매우 확장 가능한 구조로 설계되어 있어, 커스텀 BeanPostProcessor, BeanFactoryPostProcessor와 같은 스프링 확장 메커니즘을 추가로 사용하여 빈 생성과 관리 프로세스를 커스터마이징할 수 있습니다.

6. 핵심 구현 인터페이스

DefaultListableBeanFactory는 여러 인터페이스를 구현하여 다양한 기능을 지원합니다:

  • ConfigurableListableBeanFactory: 빈 팩토리의 설정을 제공하며, 빈 팩토리를 구성하고 확장할 수 있는 다양한 메서드를 정의합니다.
  • BeanDefinitionRegistry: 빈 정의를 등록하거나 제거하는 기능을 제공합니다.
  • ListableBeanFactory: 빈 목록을 제공하고, 여러 빈을 동시에 관리하는 기능을 추가로 제공합니다.

7. 실제 사용

DefaultListableBeanFactory는 보통 직접 사용하기보다는 ApplicationContext의 구현체들 (AnnotationConfigApplicationContext, XmlWebApplicationContext 등) 내부에서 사용됩니다. ApplicationContextDefaultListableBeanFactory를 포함하여 스프링 애플리케이션의 빈들을 종합적으로 관리하는 고수준의 컨텍스트를 제공합니다.

DefaultListableBeanFactory는 스프링 프레임워크에서 빈 정의를 등록하고, 빈을 생성 및 관리하며, 의존성을 주입하는 등의 역할을 수행하는 기본적인 빈 팩토리입니다. 스프링의 확장성과 유연성을 제공하는 핵심 클래스 중 하나로, 빈 팩토리의 핵심적인 기능을 모두 지원합니다.