Spring 3. ApplicationContext
3. ApplicationContext

ApplicationContext는 스프링 컨테이너이다.

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

AnnotationConfigApplicationContext를 사용하기 위해서는 AppConfig 클래스에 @Configuration 어노테이션이 붙어있어야한다.
AppConfig 파일안에 있는 @Bean 붙은 메소드들을 Bean으로 생성하여 ApplicationContext에 저장되게 된다

  • 스프링 컨테이너에는 스프링 빈 저장소가 있다.
    • 빈 저장소는 빈 이름, 빈 객체로 key-value 형식으로 저장되어있다.
    • @Bean(name="name") 빈 이름을 변경 할 수 있다.
    • 빈 이름이 같은 경우 설정에 따라 덮어 쒸워지거나, 기존께 무시될 수 있다.

빈이 등록될때는 BeanDefinition도 등록이 된다.

BeanDefinition은 빈에 대한 메타 정보가 저장된다. 그중 Role이라는 정보는 애플리케이션에서 등록한 빈인지, 스프링 내부에서 사용하는 빈인지 구분이 가능하다.

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

BeanDefinition beanDefinition = ac.getBeanDefinition("빈 이름");
if(beanDefinition.getRole() == BeanDefintion.ROLE_APPLICATION) {
  // 사용자 프로젝트에서 등록한 bean
} else if(beanDefinition.getRole() == BeanDefintion.ROLE_INFRASTRUCTURE) {
  // 스프링 내부에서 사용하는 빈
}

Bean 찾기

// name 으로 찾기
applicationContext.getBean("name", Name.class);

// 타입으로 찾기
applicationContext.getBean(Name.class);
  • 없는 빈을 찾는 경우 NoSuchBeanDefinitionException이 발생하게 된다.
  • 빈의 타입이 중복으로 존재하는 경우 NoUniqueBeanDefinitionException이 발생한다.
type으로 여러개 찾기
applicationContext.getBeansOfType(Repository.class);
type으로 조회시 상속 관계는 어떻게 될까?
  • 최상위 부모로 검색시 해당 클래스를 상속한 모든 클래스가 조회된다. Object로 검색시 모든 객체가 나온다.
    • 상속한 자식의 자식 등등 다 해당된다.

© 2025 seokh1213

LinkedIn LinkedIn GitHub