CHANGEL
SOLID BASICS
CHANGEL

공지사항

  • DEV.CHANGEL PROFILE
  • SOLID BASIC (289)
    • 공부 STUDY (115)
      • JAVA (57)
      • C | C++ (34)
      • CS (11)
      • MySQL (2)
      • ALGORITHM (1)
      • HTML (2)
      • CSS (2)
      • JS (2)
      • CODING (0)
      • MINI PROJECT (3)
    • 스프링 SPRING (21)
      • [SPRING] 김영한 스프링 입문 (11)
      • [SPRING] 남궁성 스프링의 정석 (1)
      • [SPRING] 스프링 핵심원리 (9)
    • 전공 수업 CS (65)
      • Computer Network (13)
      • algorithms (21)
      • Computer Architecture (7)
      • Software Engineering (4)
      • Data Structure (2)
      • DataBase (1)
      • Digital Engineering (14)
      • Discrete Mathematics (3)
      • Introduction to programming (0)
      • Mobile Software (0)
      • Intelligence and Informatio.. (0)
    • 대외활동 (35)
      • 신한은행 대학생 홍보대사 34기 (8)
      • SKT T프렌즈 5기 (13)
      • SK DEVOTION YOUNG 1기 (9)
      • 성균관 대학교 공학교육혁신센터 수강 (3)
      • 수상 기록 (1)
    • 솝트 33기 안드로이드 (7)
      • [솝트 33기] 회고록 (0)
      • [솝트 33기] 안드로이드 왕초보 스터디 (2)
      • [솝트 33기] 코틀린 스터디 (0)
      • [솝트 33기] Git을 털어보자 깃털 스터디 (4)
    • 멋쟁이사자처럼 11기 (6)
      • 멋사 회고록 (4)
      • 백엔드 세션 (1)
      • 기획 세션 (1)
      • 연합해커톤 운영단 (기획팀) (0)
    • 백준 BAEKJOON (16)
    • 독서 BOOK (10)
    • 자격증 CERTIFICATE (1)
    • 준비 서류 및 회고록 MEMOIR (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

최근 댓글

인기 글

CHANGEL

SOLID BASICS

[SPRING] 스프링 컨테이너에 등록된 빈을 조회해보자! | Bean 조회 및 출력하기
스프링 SPRING/[SPRING] 스프링 핵심원리

[SPRING] 스프링 컨테이너에 등록된 빈을 조회해보자! | Bean 조회 및 출력하기

2023. 1. 25. 13:36

스프링 빈 출력

모든 빈 출력하기

  • 실행하면 스프링에 등록된 모든 빈 정보를 출력할 수 있다. 
  • ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회한다. -> 28번 라인
  • ac.getBean(빈이름, 타입) or ac.getBean(타입) : 빈 이름으로 빈 객체(인스턴스)를 조회한다. -> 35번 라인

 

애플리케이션 빈 출력하기

  • 스프링이 내부에서 사용하는 빈은 제외하고, 내가 등록한 빈만 출력해보자.
  • 스프링이 내부에서 사용하는 빈은 getRole()로 구분할 수 있다. -> 34번 라인
  • ROLE_APPLICATION : 일반적으로 사용자가 정의한 빈
  • ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈 

 

 

 

스프링 빈 조회 - 기본적인 조회방법

  • ac.getBean(빈이름, 타입)
  • ac.getBean(타입)
  • 조회 대상 스프링이 없을 경우 NoSuchBeanDefinitionException : No bean named '000' available
  • **참고** 구체 타입으로 조회하면 변경시 유연성이 떨어진다.

 

 

  • 빈 이름으로 조회하기 :  findBeanByName()  메소드
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("빈 이름으로 조회")
    void findBeanByName(){
        MemberService memberService = ac.getBean("memberService", MemberService.class);
        System.out.println("memberService = "+ memberService);
        System.out.println("memberService.getClass() = "+memberService.getClass());
        Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
    }

 

 

  • 이름없이 타입으로만 조회 :  findBeanByType()  메소드
@Test
@DisplayName("이름없이 타입으로만 조회")
void findBeanByType(){
  MemberService memberService = ac.getBean(MemberService.class);
  Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}

 

 

  • 구체타입으로 조회 :  findBeanByName2()  메소드
@Test
@DisplayName("구체 타입으로 조회")
void findBeanByName2(){ //하지만 구체에 의존하는 TEST이기 때문에 좋은 TEST라고는 볼 수 없음, 유연성이 떨어짐
    MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class);
    System.out.println("memberService = "+ memberService);
    System.out.println("memberService.getClass() = "+memberService.getClass());
    Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}

 

 

  • 빈 이름으로 조회 시, 해당 빈을 찾지 못하는 경우  :  findBeanByNameX()  메소드
@Test
@DisplayName("빈 이름으로 조회X")
void findBeanByNameX(){
    // MemberService memberService = ac.getBean("xxxxx", MemberService.class);
    assertThrows(NoSuchBeanDefinitionException.class, ()->ac.getBean("xxxxx", MemberService.class));
    // 오른쪽 항에서 터진 예외가 왼쪽항이라면 test 성공
}

 

 


 

스프링 빈 조회 - 동일한 타입이 둘 이상

  • 타입으로 조회시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생한다. -> 이름을 지정해야한다.
  • ac.getBeansOfType()을 사용하면 해당 타입의 모든 빈을 조회할 수 있다. 

 

 

 

  • 타입으로 조회 시, 빈이 둘 이상있으면 중복 오류 발생 :  findBeanByTypeDuplicate() 
  AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);
  
  @Test
  @DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다.")
  void findBeanByTypeDuplicate(){
    // ac.getBean(MemberRepository.class); 에러
       assertThrows(NoUniqueBeanDefinitionException.class, ()->ac.getBean(MemberRepository.class));
  }

 

 

  • 타입으로 조회 시, 빈이 둘 이상있으면 빈 이름을 지정 : findBeanByName()
@Test
@DisplayName("타입으로 조회시 같은 타입이 둘 이상있으면, 빈 이름을 지정하면 된다.")
void findBeanByName(){
	MemberRepository memberRepository = ac.getBean("memberRepository1", MemberRepository.class);
    assertThat(memberRepository).isInstanceOf(MemberRepository.class);
}

 

  • 특정 타입을 모두 조회 : findAllBeanByName() 
@Test
@DisplayName("특정 타입을 모두 조회하기")
void findAllBeanType(){
  Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
  for (String key : beansOfType.keySet()) {
    System.out.println("key = "+ key + " value = " + beansOfType.get(key));
  }
  System.out.println("beansOfType = "+beansOfType);
  assertThat(beansOfType.size()).isEqualTo(2);
}

 

스프링 빈 조회 - 상속관계

  • 부모 타입으로 조회하면 , 자식 타입도 함께 조회된다.
  • 그래서 모든 자바 객체의 최고 부모인 Object 타입으로 조회하면, 모든 스프링 빈을 조회한다.

 

 

  • 부모 타입으로 조회시, 자식이 둘 이상이면 중복 오류 발생 : findBeanByParentTypeDuplicate() NoUniqueBeanDefinitionException
@Test
@DisplayName("부모 타입으로 조회시, 자식이 둘 이상 있으면, 중복 오류가 발생한다.")
void findBeanByParentTypeDuplicate(){
	assertThrows(NoUniqueBeanDefinitionException.class, ()-> ac.getBean(DiscountPolicy.class));
}

 

 

  • 부모 타입으로 조회시, 자식이 둘 이상이면 빈 이름 지정 : findBeanByParentTypeBeanName()
@Test
@DisplayName("부모 타입을 조회시, 자식이 둘 이상 있으면, 빈 이름을 지정하면 된다.")
void findBeanByParentTypeBeanName(){
	DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy", DiscountPolicy.class);
	assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);
}

 

 

  • 특정 하위 타입을 조회 :  findBeanBySubType()
@Test
@DisplayName("특정 하위 타입을 조회") //좋은 TEST는 아님
void findBeanBySubType(){
	RateDiscountPolicy bean = ac.getBean(RateDiscountPolicy.class);
	assertThat(bean).isInstanceOf(RateDiscountPolicy.class);
}

 

 

  • 부모 타입으로 모두 조회 : findAllBeanParentType()
@Test
@DisplayName("부모 타입으로 모두 조회하기")
void findAllBeanParentType(){
  Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.class);
  assertThat(beansOfType.size()).isEqualTo(2);
  for(String key : beansOfType.keySet()){
  	System.out.println("key = " + key + " value = "+ beansOfType.get(key));
  }
}

 

 

  • 부모 타입으로 모두 조회 - Object : findAllBeanObjectType()
@Test
@DisplayName("부모 타입으로 모두 조회하기 - object") //자바 beans에 있는 객체 모두 출력됨
void findAllBeanObjectType(){
  Map<String, Object> beansOfType = ac.getBeansOfType(Object.class);
  for(String key : beansOfType.keySet()){
  	System.out.println("key = " + key + " value = "+ beansOfType.get(key));
  }
}
저작자표시 (새창열림)

'스프링 SPRING > [SPRING] 스프링 핵심원리' 카테고리의 다른 글

[SPRING 기본] 스프링 공부 시작 전 자바의 확실한 이해는 필수...  (0) 2023.02.03
[Spring] 스프링 컨테이너 생성과정  (0) 2023.01.25
[Spring] 스프링 컨테이너 ApplicationContext  (0) 2023.01.25
[Spring] IoC, DI, 그리고 컨테이너 제어의 역전 IoC(Inversion of Control)  (0) 2023.01.25
[SPRING] 스프링 핵심원리 | 객체지향과 스프링  (0) 2023.01.25
    '스프링 SPRING/[SPRING] 스프링 핵심원리' 카테고리의 다른 글
    • [SPRING 기본] 스프링 공부 시작 전 자바의 확실한 이해는 필수...
    • [Spring] 스프링 컨테이너 생성과정
    • [Spring] 스프링 컨테이너 ApplicationContext
    • [Spring] IoC, DI, 그리고 컨테이너 제어의 역전 IoC(Inversion of Control)
    CHANGEL
    CHANGEL
    NOT GIVING UP | SOLID BASICS

    티스토리툴바