FrameWork/Spring&Spring-boot

스프링 빈 조회 - 기본☆

Surge100 2022. 1. 1. 13:01

스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법

  • 'ac.getBean('빈이름' , '타입')
  • 'ac.getBean(타입)'
  • 조회 대상 스프링 빈이 없으면 예외 발생

         -'NoSuchBeanDefinition: No bean nasted 'xxxx' avaliable'

 

 

package hello.core.beanfind;

import hello.core.AppConfig;
import hello.core.member.MemberService;

import hello.core.member.MemberServiceImpl;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;

class ApplicationContextBasicFindTest {

    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());

        assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
    }

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

    @Test
    @DisplayName("구체 타입으로 조회")
    void findBeanByName2(){
        MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);
        //System.out.println("memberService = " + memberService);
        //System.out.println("memberService.getClass() = " + memberService.getClass());

        assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
    }


    @Test
    @DisplayName("빈 이름으로 조회x")
    void findBeanByNameX(){
        //ac.getBean("xxxx",MemberService.class);
        assertThrows(NoSuchBeanDefinitionException.class,
                () -> ac.getBean("xxxx", MemberService.class));
    }
}

 

 

인터페이스로 조회하면 인터페이스의 구현체가 대상이된다.

 

@Bean
public MemberService memberService(){
    return new MemberServiceImpl(memberRepository());
}

-> 스프링빈에 등록된 Instance 타입을 보고 결정이 되기 때문에, 꼭 인테페이스 타입으로 객체를 불러올 필요는 없다.

  

      하지만, 굳이 구제적인 구현체를 type으로 지정할 필요는 없다.(유연성이 떨어진다.)

       항상 역할구현을 구분하고, 역할(인터페이스)에 의존해야하기 때문이다.

 

 

 

 

 

.assertThrows(예외,로직)

assertThrows(NoSuchBeanDefinitionException.class,
        () -> ac.getBean("xxxx", MemberService.class));

-> 왼쪽에 로직을 실행하면, 오른쪽의 예외가 터져야한다는 의미

    

    즉. 예외가 발생해야 pass 

 

 

[출처 : 김영한. 스프링 핵심 원리-기본편. 인프런]