본문 바로가기
스프링/핵심 원리

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

by drCode 2022. 1. 28.
728x90
반응형

스프링 컨테이너에 실제 스프링 빈들이 잘 등록되었는지 확인해보자.

 

테스트에서 ApplicationContextInfoTest.java를 만든다.

 

package hello.core.beanFind;

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

public class ApplicationContextInfoTest {

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("모든 빈 출력하기")
    void findAllBean() {
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        // "iter" 입력 후 탭 하면 향상된 for문 완성됌
        for (String beanDefinitionName : beanDefinitionNames) {
            Object bean = ac.getBean(beanDefinitionName);
            System.out.println("name = " + beanDefinitionName + " object = " + bean);
        }
        
    }

    @Test
    @DisplayName("애플리케이션 빈 출력하기")
    void findApplcationBean() {
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        // "iter" 입력 후 탭 하면 향상된 for문 완성됌
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);

            // Role_Application : 스프링 내부에서 뭔가 등록한 빈이 아니라 내가 애플리케이션 개발하기위해서 등록한 빈이나 외부 라이브러리
            // Role ROLE_INFRASTRUCTURE : 스프링 내부에서 사용하는 빈
            if(beanDefinition.getRole() == BeanDefinition.ROLE_INFRASTRUCTURE) {
                Object bean = ac.getBean(beanDefinitionName);
                System.out.println("name = " + beanDefinitionName + " object = " + bean);
            }
        }
    }
}

 

iter를 입력 후 탭을 누르면 향상된 for문이 완성된다.

 

 

findAllBean()을 실행하면 

내가 만든 애플리케이션 빈 뿐만 아니라 스프링 내부적으로 등록한 빈의 정보들도 출력된다.

 

내가 만든 애플리케이션 빈만 보고싶다면 아래의 소스로 findApplicationBean에서 for문에서의 조건을 ROLE_APPLICATION으로 하면 된다.

if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
	Object bean = ac.getBean(beanDefinitionName);
	System.out.println("name = " + beanDefinitionName + " object = " + bean);
}

 

findApplicationBean를 실행해서 스프링 내부에서 생성하는 빈에 대해 보고싶으면

if(beanDefinition.getRole() == BeanDefinition.ROLE_INFRASTRUCTURE) {
	Object bean = ac.getBean(beanDefinitionName);
	System.out.println("name = " + beanDefinitionName + " object = " + bean);
}

위의 소스처럼 고치면 된다.

 

  • 모든 빈 출력하기
    • 실행하면 스플이에 등록된 모든 빈 정보를 출력할 수 있다.
    • 'ac.getBeanDefinitionNames()' : 스프링에 등록된 모든 빈 이름을 조회한다.
    • 'ac.getBean()' : 빈 이름으로 빈 객체(인스턴스)를 조회한다.
  • 애플리케이션 빈 출력하기
    • 스프링이 내부에서 사용하는 빈은 제외하고, 내가 등록한 빈만 출력해보자
      • 'ROLE_APPLICATION' : 일반적으로 사용자가 정의한 빈
      • 'ROLE_INFRASTRUCTURE' : 스프링이 내부에서 사용하는 빈
728x90
반응형

댓글