스프링 컨테이너 생성
자바 설정 클래스를 기반으로 스프링 컨테이너 생성할 수 있다.
new AnnotationConfigApplicationContext(AppConfig.class);
AnnotationConfigApplicationContext는 ApplicatinContext 인터페이스의 구현체이다.
AppConfig.class 에 있는 구성 정보를 활용해서 컨테이너 생성
빈 이름
빈 이름은 메서드 이름을 사용
아래와 같이 빈 이름은 직접 부여할 수도 있다.
@Bean(name="memberService2")
스프링은 빈을 생성하고, 의존관계를 주입하는 단계가 나누어져 있다.
자바 코드로 스프링 빈을 등록하면 생성자를 호출하면서 의존관계 주입도 한번에 처리된다.
스프링 빈 조회 - 상속 관계
부모 타입으로 조회하면, 자식 타입도 함께 조회 -> 그래서 모든 자바 객체의 부모인 Object 타입으로 조회하면, 모든 스프링 빈을 조회
BeanFactory 와 ApplicationContext
BeanFactory
- 스프링 컨테이너의 최상위 인터페이스
- 스프링 빈을 관리하고 조회하는 역할을 담당
- getBean() 을 제공
ApplicationContext
- BeanFacotry 기능을 모두 상속 받아서 제공
- 빈을 관리하고 검색하는 기능을 BeanFactory가 제공
- 애플리케이션을 개발할 때는 빈을 관리하고 조회하는 기능 + 수많은 부가기능이 필요
- 부가기능을 ApplicationContext 가 제공
다양한 설정 형식 지원
스프링 컨테이너는 다양한 형식의 설정 정보를 받아드릴 수 있게 설계되어 있다.
위에서는 java로 작성된 AppConfig.java 를 설정 정보로 주었는데 XML, Groovy 등 다양한 형태로 제공할 수 있다.
BeanDefinition
다양한 설정 형식을 지원하기 위해서 `BeanDefinition` 이라는 추상화가 있다.
역할과 구현을 개념적으로 나눈 것이다.
- XML을 읽어서 BeanDefinition을 만든다.
- 자바 코드를 읽어서 BeanDefinition을 만든다.
-> 스프링 컨테이너는 자바 코드인지, XML인지 몰라도 되고, 오직 BeanDefinition 만 알면 된다.
BeanDefinition을 빈 설정 메타 정보라 한다.
- `@Bean` 당 각각 하나씩 메타 정보가 생성된다.
- 스프링 컨테이너는 이 메타 정보를 기반으로 스프링 빈을 생성한다.
`AnnotationConfigApplicationContext`는 `AnnotationBeanDefinitionReader` 를 사용해서 `AppConfig.class`를 읽고 BeanDefinition을 생성
BeanDefinition을 직접 정의해서 사용할 일은 거의 없다. BeanDefinition에 대해서는 너무 깊이있게 이해하기 보다는, 스프링이 다양한 형태의 설정 정보를 BeanDefinition 으로 추상화해서 사용하는 것 정도만 이해하면 된다.