ApplicationContext는 Spring의 IoC컨테이너를 나타내며, 빈의 인스턴스화 구성, 조립을 담당한다.
Spring IoC컨테이너는 다음과 같이 동작한다.
Application Class(POJOs)는 구성 메타데이터와 결합하여 IoC 컨테이너에서 읽어 Bean을 생성하고 초기화 된 이후 시스템을 사용할 수 있도록 구성한다.
ApplicationContext는 IoC 컨테이너를 나타내며, 다양한 Bean을 인스턴스화 하며 구성하고 조립하는 역할을 수행한다.
ApplicationContext는 BeanFactory를 상속받아 구현되었다.
ApplicationContext 코드를 자세히 살펴보면 상속받은 인터페이스들이 많은 것을 알 수 있다.
package org.springframework.context;
import org.springframework.beans.factory.HierarchicalBeanFactory;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.core.env.EnvironmentCapable;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.lang.Nullable;
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
@Nullable
String getId();
String getApplicationName();
String getDisplayName();
long getStartupDate();
@Nullable
ApplicationContext getParent();
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
이를 통해 ApplicationContext는 빈 관리 뿐만이 아닌 설정정보 제어 등 다양한 역할을 한다는 것을 알 수 있다.
클라이언트에서 빈을 요청하면 다음과 같은 과정을 거쳐 빈을 반환한다.
ApplicationContext는 @Configuration가 붙은 클래스들을 설정 정보에 등록해두고 @Bean이 붙은 메소드의 이름, ComponentScan을 통해 @Component가 붙은 클래스들을 빈으로 등록하고 빈 목록을 생성한다.
이후 클라이언트가 빈을 요청하면 ApplicationContext에서는 자신의 빈 목록에서 요청한 이름이 있는지 확인한다. 만약 있다면 해당 빈을 호출하여 객체를 생성하고 돌려준다.
그러나 만약 모든 빈들을 일일히 생성하고 클라이언트에게 돌려줄 수는 없다.
하나의 클라이언트가 1초에 1개의 요청을 하는데 클라이언트 수가 10000명이 넘어간다면 서버가 터질 것이기 때문이다.
이를 위해 스프링은 싱글톤 방식으로 빈을 생성하고 관리한다.
Reference
https://docs.spring.io/spring-framework/reference/core/beans/basics.html
https://mangkyu.tistory.com/151