//스프링 컨테이너 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext 은 인터페이스이므로 다형성이 적용이 되어있다.AnnotationConfigApplicationContext 는 ApplicationContext 의 구현체 중 하나이다.AnnotationConfigApplicationContext 는 AnnotationConfig 설정을 기반으로 ApplicationContext (스프링)을 만드는 것이다.new AnnotationConfigApplicationContext(AppConfig.class);을 통해서 AppConfig.class를 설정정보로 하여 스프링 컨테이너가 생성된다.
설정정보(AppConfig.class)를 보고 스프링 컨테이너의 스프링 빈 저장소에 빈이름&빈객체를 key&value 형태로 등록해준다.
빈 요청이 들어오면 BeanDefinition에 등록된 빈 정보들을 보고 필요한 빈 객체들을 만든다.
설정정보(AppConfig.class)를 참고하여 빈들 사이의 의존관계 설정을 해준다.

getBean() 을 제공ApplicationContext 은 BeanFactory 의 기능을 상속받는다.ApplicationContext 은 빈 관리기능 + 편리한 부가기능을 제공한다.BeanFactory 나 ApplicationContext 를 스프링 컨테이너라 한다.AppConfig.java와 같은 팩토리 메서드에서 메서드를 조작해서 스프링 빈을 등록한다.<Bean id=”” class=””></Bean> 를 이용해 직접 스프링 빈을 등록스프링은 어떻게 다양한 설정 형식(java, xml등)을 지원하는 것일까?
그 중심에는 BeanDefinition 이라는 추상화가 있다.
이는 역할과 구현을 개념적으로 나눈 것이다.
@Bean / <bean> 당 각각 하나씩 메타 정보가 생성된다.
AnnotationConfigApplicationContext 는 AnnotatedBeanDefinitionReader 를 사용해서
AppConfig.class 를 읽고 BeanDefinition 을 생성한다.
BeanDefinition에 빈의 이름을 비롯한 빈의 메타정보를 담는다.