//스프링 컨테이너 생성
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에 빈의 이름을 비롯한 빈의 메타정보를 담는다.