BeanDefinition (인프런) 김영한님의 스프링 핵심 원리-기본편을 공부하고 리뷰한 글입니다.
8. 스프링 빈 설정 메타 정보(BeanDefinition)
Q. 스프링이 다양한 설정 형식을 지원할 수 있는 이유는?
그 중심에는 바로 BeanDefinition이라는 추상화가 있다.
즉, 설정 정보의 역할과 구현을 개념적으로 분리한 것으로 설정 정보를 추상화시켰다.
스프링 컨테이너는 BeanDefinition(역할)만 알고 자바 코드인지, XML 인지(구현)은 몰라도 된다.
- XML 을 읽어 BeanDefinition 만듦
- 자바 코드를 읽어 BeanDefinition 만듦
● BeanDefinition = 빈 설정 메타정보
- @Bean / <bean> 하나당 하나씩 메타 정보가 생성된다.
- 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.
<코드 레벨로 깊이있게 들어가기>
어려우면 그냥 그런가보다하고 넘어가도 되는 부분이다.
- AnnotationConfigApplicationContext 는 AnnotatedBeanDefinitionReader 를 사용해서 AppConfig.class 를 읽고 BeanDefinition 을 생성한다.
- GenericXmlApplicationContext 는 XmlBeanDefinitionReader 를 사용해서 appConfig.xml 설정 정보를 읽고 BeanDefinition 을 생성한다.
- 새로운 형식의 설정 정보가 추가되면, XxxBeanDefinitionReader를 만들어서 BeanDefinition 을 생성하면 된다.
1. BeanDefinition 살펴보기
1) BeanDefinition 정보
2) BeanDefinitionTest 코드 작성
빈 설정 메타 정보(BeanDefinition)를 확인하는 테스트 코드다.
package hello.core.beandefinition;
import hello.core.AppConfig;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class BeanDefinitionTest {
// getBeanDefintion을 하기 위해 ApplicationContext로 선언하지 않음
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
//GenericXmlApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
@Test
@DisplayName("빈 설정 메타정보 확인")
void findApplicationBean() {
// 모든 빈 이름 조회
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
// 빈 이름으로 beanDefintion 조회
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
// 사용자가 등록한 빈의 메타정보만 출력
if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
System.out.println("beanDefinitionName = " + beanDefinitionName +
" beanDefinition = " + beanDefinition);
}
}
}
}
3) 결과
<정리>
- BeanDefinition을 직접 생성해서 스프링 컨테이너에 등록할 수 도 있다. 하지만 실무에서 BeanDefinition을 직접 정의하거나 사용할 일은 거의 없으니 어려우면 그냥 넘어가자!
- BeanDefinition에 대해서는 너무 깊이있게 이해하기 보다는, 스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용하는 것 정도만 이해하면 된다.
- 가끔 스프링 코드나 스프링 관련 오픈 소스의 코드를 볼 때, BeanDefinition 이라는 것이 보일 때가 있다. 이때 이러한 메커니즘을 떠올리면 된다.
'Spring > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
[스프링 핵심 원리] 05. 싱글톤 컨테이너 - 싱글톤 컨테이너 & 싱글톤 방식의 주의점(중요★) (0) | 2022.05.17 |
---|---|
[스프링 핵심 원리] 05. 싱글톤 컨테이너 - 웹 애플리케이션과 싱글톤 & 싱글톤 패턴 (0) | 2022.05.17 |
[스프링 핵심 원리] 04. 스프링 컨테이너와 스프링 빈 - BeanFactory와 ApplicationContext & 다양한 설정 형식 지원(자바 코드, XML) (0) | 2022.05.16 |
[스프링 핵심 원리] 04. 스프링 컨테이너와 스프링 빈 - 스프링 빈 조회(상속 관계) (0) | 2022.05.16 |
[스프링 핵심 원리] 04. 스프링 컨테이너와 스프링 빈 - 스프링 빈 조회(동일한 타입이 둘 이상) (0) | 2022.05.16 |