Bean 컨테이너(ApplicationContext)의 핵심 기능은 애플리케이션에 필요한 Bean(DI 작업이 완료되어 실행 가능한 상태의 Bean)을 생성하고, 초기화하는 것이다.
Bean 생성을 위해 XML, Property, Annotation과 같은 설정 정보를 바로 읽으면서 인스턴스를 생성하는 것이 아니라 BeanDefinition으로 설정 메타 정보를 읽은 후 다음 단계로 Bean 인스턴스를 생성한다.
상세
ApplicationContext는 Bean 생성 및 관리에 대한 책임을 BeanFactory에게 모두 위임한다. 즉, Spring Framework에서 Bean Lifecycle 관리에 대한 모든 책임은 BeanFactory가 가진다.
ApplicationContext는 BeanDefinitionReader를 통해 BeanDefiniton 정보를 읽는다. BeanDefiniton 정보는 BeanDefinitionRegistry interface에 대한 구현체가 담당하는데 이 구현체가 BeanFactory 구현체에서 같이 담당한다. 즉, ApplicationContext는 BeanDefinitionReader를 활용해 BeanDefiniton을 읽어 들인 후 모든 정보는 BeanFactory가 관리한다.
ApplicationContext는 앞에서 읽은 BeanDefinition 정보를 활용해 Bean 인스턴스 생성 및 초기화 등의 LIfecycle을 거친 후 모든 Bean은 BeanFactory가 담당하도록 한다.(AbstractApplicationContext의 refresh() method가 BeanFactory의 초기화 과정을 담당한다.)
vs BeanFactory
ApplicationContext 를 역할을 간단히 설명하자면
오브젝트 생성, 관계설정, 만들어지는 방식, 자동생성, 후처리등 여러가지 일들을 한다. 아주 많은 일을 하니 이것은 따로 살펴보도록하자. 또 한 BeanFactory를 상속받고 있다.
그럼 ApplicationContext와 BeanFactory 차이점은 뭘까?
실제 차이점을 검색해보면 대부분 이런글들이 많다. ApplicationContext는 Pre-loading을 하고 즉, 즉시 인스턴스를 만들고 BeanFactory는 lazy-loading을 하여 실제 요청 받는 시점에서 인스턴스를 만든다고 한다. 정리하자면 두 인터페이스의 차이점은 인스턴스화 시점이 다르다는 것이다.
요약
상세
vs BeanFactory
ApplicationContext 를 역할을 간단히 설명하자면
그럼 ApplicationContext와 BeanFactory 차이점은 뭘까?