스프링 빈 설정 메타 정보에 대하여 알아보았다.

스프링은 어떻게 이런 다양한 설정 형식을 지원하는 것일까?

 

그 중심에는 BeanDefinition 이라는 추상화가 있다.

 

쉽게 이야기해서 역할과 구현을 개념적으로 나눈 것이다.

-XML을 읽어서 BeanDefinition을 만들면 된다.

-자바코드를 읽어서 BeanDefinition을 만들면 된다.

-스프링 컨테이너는 자바 코드인지, XML인지 몰라도 된다. 오직 BeanDefinition만 알면 된다.

 

BeanDefinition을 빈 설정 메타정보라 한다.

-@Bean , <bean> 당 각각 하나씩 메타정보가 생긴다.

 

스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/lecture/55359?speed=0.75&tab=note&mm=close
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/lecture/55359?speed=0.75&tab=note&mm=close

코드레벨에서 들어가보면

AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader 라는 것을 사용하여

자바 코드를 설정정보처럼 읽어버린다. 그렇게 BeanDefinition을 생성한다.

 

package hello.core;

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;

public class BeanDefinitionTest {

    AnnotationConfigApplicationContext ac =new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("빈 설정 메타정보 확인")
    void findApplicationBean(){
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);

            if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
                System.out.println("beanDefinitionName = " + beanDefinitionName + " beanDefinition = "+beanDefinition);
            }
        }
    }
}

테스트 코드 작성을 해보았다.

 

콘솔에서 각종 정보들을 볼 수 있었다.

 

BeanDefinition을 직접 생성하여 스프링 컨테이너에 등록할 수 도 있다. 

스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용하는 것이다.

 

 

+ Recent posts