컨테이너 생성#
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);1. 스프링 컨테이너 생성#

new AnnotationConfigApplicationContext(AppConfig.class)
2. 스프링 빈 등록#

- 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈 등록
** 빈 이름 **
- 기본적으로 메서드 이름을 사용
- 직접 부여 가능
@Bean(name= [...]) - 빈 이름은 항상 고유해야함
3. 스프링 빈 의존관계 설정 - 준비#

- 객체 생성
4. 스프링 빈 의존관계 설정 - 완료#

- 설정 정보를 참고해서 의존관계 주입
컨테이너에 등록된 모든 빈 조회#
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("애플리케이션 빈 출력하기")
void findApplicationBean(){
String[]beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
// ROLE_APPLICATION : 직접 등록한 애플리케이션 빈
// ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈
if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = " + beanDefinitionName + "obejct = " + bean);
}
}
}빈 조회#
가장 기본적인 조회 방법#
ac.getBean(이름, 타입)ac.getBean(타입)- 없으면 예외발생
동일한 타입 2개이상#
- 타입으로 조회시 오류 (이름지정필수)
ac.getBeanOfType()
상속관계#
- 부모 타입으로 조회하면, 자식 타입도 함께 끌려나옴
BeanFactory와 ApplicationContext#

- ApplicationContext는 BeanFactory 상속받음
- 빈 관리기능 + 부가기능
- 이것이 컨테이너!!
ApplicationContext 기능
BeanFactory기능을 모두 상속받아 제공- ApplicationContext 부가기능
- 메시지 소스를 활용한 국제화기능
- 환경변수
- 애플리케이션이벤트
- 편리한 리소스 조회
다양한 설정 지원#
스프링 컨테이너는 다양한 설정 정보를 받아들일 수 있음

어노테이션 기반#
new AnnotationConfigApplicationContext(AppConfig.class)- 자바 코드로 된 설정정보를 넘기면 됨
XML#
GenericXmlApplicationContext사용
ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
MemberService memberService = ac.getBean("memberService", MemberService.class);설정 메타 정보 -BeanDefinition#
스프링은 자바 코드던, xml이던 상관없이읽어서
BeanDefinition을 민든다.bean당 하나씩 메타 정보가 생성되고,스프링 컨테이너가 이를 기반으로 스프링 빈을 생성한다.
스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용한다정도만 이해하자.