<aside> 💡 스프링은 어떻게 이런 다양한 설정 형식을 지원하는 것일까? 그 중심에는 BeanDefinition이라는 추상화가 있다.
</aside>
BeanDefinition, 즉 빈 설정 메타정보만 알면 된다.<aside> 💡 BeanDefinition이란? 스프링 프레임워크에서 Bean 객체의 정의를 담고 있는 객체다. BeanDefinition 객체는 Bean의 클래스 정보, 생성자 정보, 프로퍼티 정보, 메소드 정보 등의 정보를 담고 있다. 이 정보를 통해 Bean 객체를 생성하고 관리할 수 있다. BeanDefinition은 BeanFactory와 ApplicationContext가 관리하는 Bean정보의 기본적인 정의를 담고 있다.
</aside>
@Bean이나, XML방식의 <bean>에는 각각 메타 정보가 생성되며, 스프링 컨테이너는 이 메타정보를 읽어들임으로써 스프링 빈을 생성한다.
코드 레벨로 조금 더 깊게 들어가면 아래와 같다.

AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 사용해서 AppConfig.class를 읽고 BeanDefinition을 생성한다.
GenericXmlApplicationContext는 XmlBeanDefinitionReader를 사용해서 appConfig.xml설정 정보를 읽고 BeanDefinition을 생성한다.
새로운 형식의 설정 정보가 추가되면, OOOBeanDefinitionReader를 만들어 BeanDefinition을 생성하면 된다.