[ Spring ] Bean 조회

신범철·2022년 9월 26일
0

스프링부트

목록 보기
7/24

스프링 컨테이너란?

스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할을 한다. 여기서 말하는 자바 객체는 스프링에서 Bean을 의미한다.

< BeanFactory >
스프링 컨테이너의 최상위 인터페이스이다.
스프링 빈을 관리하고 조회하는 역할을 함

< ApplitcationContext >
BeanFactory 기능을 모두 상속받아서 제공한다.
빈을 관리하고 조회하는 역할 외에도 부가기능을 제공한다.

  • MessageSource : 메시지소스를 활용한 국제화 기능(한국어, 영어 등)
  • EnvironmentCapable : 환경변수(로컬, 개발, 운영 등을 구분해서 처리)
  • ApplicationEventPublisher : 이벤트를 발행하고 구독하는 모델을 편리하게 지원
  • ResourceLoader : 파일, 클래스, 외부 등 리소스를 편하게 관리

스프링 컨테이너 생성

//스프링 컨테이너 생성
ApplicationContext applicationContext =
 new
AnnotationConfigApplicationContext(AppConfig.class);
  • AppConfig 클래스 안에 있는 Bean들을 스프링 컨테이너에 저장한다.

컨테이너에 등록된 모든 빈 조회

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.config.BeanDefinition;
import
org.springframework.context.annotation.AnnotationConfigApplicationContext;
import static org.assertj.core.api.Assertions.assertThat;

class ApplicationContextInfoTest {
 	AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
 	@Test
 	@DisplayName("모든 빈 출력하기")
 	void findAllBean() {
 		String[] beanDefinitionNames = ac.getBeanDefinitionNames();
 		for (String beanDefinitionName : beanDefinitionNames) {
 		Object bean = ac.getBean(beanDefinitionName);
 		System.out.println("name=" + beanDefinitionName + " object=" +
bean);
 		}
 }
 	@Test
 	@DisplayName("애플리케이션 빈 출력하기")
 	void findApplicationBean() {
 		String[] beanDefinitionNames = ac.getBeanDefinitionNames();
 		for (String beanDefinitionName : beanDefinitionNames) {
 		BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
 		//Role ROLE_APPLICATION: 직접 등록한 애플리케이션 빈
 		//Role ROLE_INFRASTRUCTURE: 스프링이 내부에서 사용하는 빈
 		if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
 			Object bean = ac.getBean(beanDefinitionName);
 			System.out.println("name=" + beanDefinitionName + " object=" + bean);
 		}
 	}
  }
}
  • ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회한다.
  • ac.getBean() : 빈 이름으로 빈 객체(인스턴스)를 조회한다.

특정 스프링 빈 조회

	package hello.core.beanfind;

import hello.core.AppConfig;
import hello.core.member.Member;
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.*;

public class ApplicationContextBasicFindTest {

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("빈 이름으로 조회")
    void findBeanByName(){
        MemberService memberService = ac.getBean("memberService", MemberService.class);

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


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

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

    @Test
    @DisplayName("구체 타입으로 조회")
    void findBeanByName2(){
        MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class);

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

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

}
profile
https://github.com/beombu

0개의 댓글