-
(스프링 기본) 11 - 스프링 빈 설정 메타 정보(BeanDefinition)개발/Spring 2024. 10. 9. 17:43
스프링이 다양한 설정 형식을 지원하는 것에는 BeanDefinition 이라는 추상화가 있다.
역할과 구현을 나눴기 때문에 xml 이든 자바코드이든 구현하면 된다.
BeanDefinition 을 빈 설정 메타정보라 한다.
@Bean, <bean> 당 각각 하나씩 메타 정보가 생성된다
스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.
AnnotationConfigApplicationContext 안에 있는 AnnotatedBeanDefinitionReader 이
AppConfig.class 의 설정 정보를 읽어서 BeanDefinition 빈 메타정보를 생성한다.
GenericXmlApplicationContext 안에 있는 XmlBeanDefinitionReader 이
appConfig.xml 파일을 읽어서 마찬가지로 빈 메타 정보를 생성한다.
이렇게 새로운 형식으로 설정 정보를 읽는 것은 원하는BeanDefinitionReader 을 만들면 된다.
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 + " bean" + beanDefinition); } } }
우리가 생성한 Bean 들만 출력해본다.
그러면 다음과 같이 BeanDefinition 이 출력된다.
빈 등록 방식은 크게 보자면 두 가지이다.
직접 xml 처럼 등록하거나, AppConfig 에서 정의한 메서드처럼 factory 매서드로 등록하는 것이 있다.
따라서 다음과 같이 xml 로 정의했을 떄는 직접 경로가 다 잘 나와있으며,
factory로 등록하지 않았기 때문에 factoryBeanName 과 factoryMethodName 이 Null 로 나온다.
반면에 AppConfig 에서처럼 자바 애노테이션으로 factory 등록했을 경우에는
factoryBeanName 과 factoryMethodName 이 나오게 된다.
■ 정리
- BeanDefinition 을 통해 스프링 빈 설정 메타 정보를 등록할 수 있다.
- BeanDefinition 을 직접 생성해서 스프링 컨테이너에 등록할 수 있다. (하지만 그럴 일이 거의 없다.)
- 스프링 빈 만드는 방법 2가지 있는데 직접 등록, factoryBean 통해 등록하는 법이다.
(일반적인 것은 factoryBean 으로 등록하는 방법이다.)
출처 : 김영한 스프링 핵심 원리 - 기본편
'개발 > Spring' 카테고리의 다른 글
(스프링 기본) 13 - 싱글톤 패턴 (0) 2024.10.23 (스프링 기본) 12 - 웹 애플리케이션과 싱글톤 (0) 2024.10.23 (스프링 기본) 10 - 다양한 설정 형식 지원(자바코드, XML) (0) 2024.10.09 (스프링 기본) 9 - BeanFactory 와 ApplicationContext (0) 2024.10.09 (스프링 기본) 8 - 컨테이너에 등록된 모든 빈 조회 (1) 2024.10.09