#BeanFactory & ApplicationContext
1) BeanFactory
- 스프링 컨테이너의 최상위 인터페이스로, 스프링 빈을 관리하고 조회하는 역할을 담당한다.
- getBean()을 제공하는 역할을 하며, 우리가 사용했던 대부분의 기능은 BeanFactory가 제공하는 기능이다.
2)ApplicationContext
- BeanFactory의 기능을 모두 상속받아서 제공하며, 빈을 관리하고 조회하는 기능은 물론 수많은 부가기능을 제공한다.
EX) 국제화 기능, 환경변수(로컬 환경,개발 환경, 운영 환경을 구분해서 처리), 애플리케이션 이벤트, 편리한 리소스 조회..
- BeanFactory를 직접 사용할 일은 거의 없으며, 부가기능이 포함된 ApplicationContext를 주로 사용한다
= BeanFactory혹은 ApplicationContext를 스프링 컨테이너라고 한다.
#다양한 설정 형식 지원- 자바 코드, XML
: 스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있도록 유연하게 설계되어있다.
1) Annotation 기반 자바 코드 설정 방식 : @Configuration, @Bean
- XML에 비해 훨씬 많이 사용한다.
- AnnotationConfigApplicationContext를 사용하며, 자바 코드로 된 설정 정보를 넘기면 된다.
2) XML 설정 사용: <bean>
- 최근에는 스프링 부트를 많이 사용하여 자주 쓰진 않지만 알아두면 좋음.
- GenericXmlApplicationContext를 사용하여 xml 설정 파일을 넘기면 됨.
#스프링 빈 설정 메타 정보 - BeanDefinition
- 스프링이 다양한 설정 형식을 지원하는 데에는 BeanDefinition이라는 추상화가 있다.
-> 이는 역할과 구현을 개념적으로 나눈것으로, 스프링 컨테이너는 자바 코드인지 XML인지 몰라도 이를 읽어서 오직 BeanDefinition만 만들면 된다.
- Bean Definition은 빈 설정 메타정보로, @Bean, <Bean> 당 하나의 메타 정보가 생성된다.
- 스프링 컨테이너는 이를 기반으로 스프링 빈을 생성한다.
- 실제 작동 방식
- AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 이용해 AppConfig.class를 읽고, BeanDefinition을 생성한다.
-XML 기반 클래스도 위와 같은 과정을 통해 BeanDefinition을 만든다.
- 이전에 beanDefinition의 Role을 통해서 자신이 직접 등록한 스프링 빈만을 출력하거나, 전체 모든 빈을 출력할 수 있었다.
@Test
@DisplayName("빈 설정 메타정보 확인")
void findApplicationBean() {
String[] beanDefinitionNames=ac.getBeanDefinitionNames();
for (String beanDefinitionNames: beanDefinitionNames){
BeanDefinition beanDefinition=ac.getBeanDefinition(beanDefinitionName);
if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
System.out.println("beanDefinitionName" + beanDefinitionName +
" beanDefinition = " + beanDefinition);
}
}
}
- BeanDefinition에 대해선 스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화하여 사용한다는 것 정도만 알아두자!
'Web > Java (Spring+JSP)' 카테고리의 다른 글
Spring 핵심 원리 #9- 컴포넌트 스캔 (0) | 2022.01.15 |
---|---|
Spring 핵심 원리 #8- 싱글톤 컨테이너 (0) | 2022.01.12 |
Spring 핵심 원리 #6- 스프링 컨테이너 생성과 등록된 빈 조회 (0) | 2022.01.07 |
Spring 핵심 원리 #5- IOC,DI, 그리고 컨테이너 (0) | 2021.11.15 |
Spring 핵심 원리 #4- AppConfig 리팩토링/총정리 (0) | 2021.11.12 |