Spring/스프링 핵심 원리 - 기본편

[스프링 컨테이너와 스프링 빈] BeanDefinition - 스프링 빈 설정 메타 정보

alsruds 2023. 11. 25. 18:22
🧐강의🧐
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/dashboard

 

BeanDefinition

BeanDefinition : Bean 정보에 대한 추상화 (Bean 설정 메타 정보)

          》@Bean, <bean> 당 각각 하나의 메타 정보 생성

BeanDefinition 정보 설명
BeanClassName 생성할 빈의 클래스명 (자바 설정처럼 팩토리 역할의 빈 사용 시에는 없음)
FactoryBeanName 팩토리 역할의 빈을 사용할 경우 이름 (ex. appConfig)
FactoryMethodName 빈을 생성할 팩토리 메서드 지정 (ex. memberService)
Scope 싱글톤 - 기본값
LazyInit 스프링 컨테이너 생성 시, 실제 빈을 사용할 때까지 빈의 생성을 최대한 지연 처리하는지 여부
InitMethodName 빈 생성 & 의존 관계 적용 후 호출되는 초기화 메서드명
DestroyMethodName 빈의 생명 주기가 끝나 제거되기 직전 호출되는 메서드명
Constructor arguments, Properties 의존 관계 주입 시 사용 (자바 설정처럼 팩토리 역할의 빈 사용 시에는 없음)

 

☑️ 스프링 컨테이너는 메타 정보를 기반으로 스프링 빈 생성

 

☑️ 코드 레벨로 확장

· AnnotationConfigApplicationContext 는 AnnotatedBeanDefinitonReader 를 사용해 AppConfig.class 를 읽고, BeanDefinition 생성

· 새로운 형식의 설정 정보가 추가될 시, ~BeanDefinitionReader 를 만들어 BeanDefinition 생성

 

빈 설정 메타 정보 확인하기

1. test/java/hello.core/beandefinition Package 생성

2. test/java/hello.core/beandefinition/BeanDefinitionTest Class 생성

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 에 대한 깊은 이해보다는, 스프링이 다양한 형태의 설정 정보를 BeanDefinition 으로 추상화하여 사용한다는 정도로만 이해하자