본문으로 바로가기
반응형

 

 

 

AppConfig에 등록된 스프링 빈을 모두 조회하고자 한다.

 

 

 

 

참고로 AppConfig에 등록된 스프링 빈들은 아래와 같다.

 

package hello.core;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean // 스프링 컨테이너에 등록이 됨
    public MemberService memberService() {
        System.out.println("call AppConfig.memberService");
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        System.out.println("call AppConfig.memberRepository");
        return new MemoryMemberRepository();
    }

    @Bean
    public OrderService orderService() {
        System.out.println("call AppConfig.orderService");
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    @Bean
    public DiscountPolicy discountPolicy() {
//        return new FixDiscountPolicy(); // 정액 할인
        return new RateDiscountPolicy();  // 정률 할인
    }

}

 

 

 

 

 

 

 


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

 

 

 

 

 

○ 테스트 코드 작성

 

 

 

 

 

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;

class ApplicationContextInfoTest {

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("모든 빈 출력하기")
    void findAllBean() {
//      ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회한다.
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
//          ac.getBean() : 빈 이름으로 빈 객체(인스턴스)를 조회한다.
            Object bean = ac.getBean(beanDefinitionName);
            System.out.println("name = " + beanDefinitionName + " object = " + bean);
        }
    }

}

 

.getBeanDefinitionNames() 메서드를 통해 

스프링 컨테이너에 등록된 모든 빈 이름을 조회한 후,

.getBean() 메서드로 빈 객체(인스턴스)를 조회할 수 있다.

 

 

 

 

 

 

 

테스트 코드를 실행해보면..

 

 

 

 

 

컨테이너에 등록된 모든 스프링 빈들이 출력되는 것을 볼 수 있다.

 

 

 

 

하지만 출력 결과를 보면 

org.springframework.context.... 로 시작하는 빈들을 볼 수 있다.

(내가 등록한 적이 없는데,,)

 

 

 

이 빈들은 스프링을 실행할 때 생성되는 고유의 스프링 빈들이다.

 

 

이것들을 제외하고 내가 생성한 애플리케이션 빈들만 출력할 수는 없을까?

 

 

 

 

 

 


○ 애플리케이션 빈 조회(내가 생성한 빈)  

 

 

 

 

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;

class ApplicationContextInfoTest {

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("애플리케이션 빈 출력하기")
    void findApplicationBean() {
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            // ac.getBeanDefinition(빈 이름) : 해당 빈에 대한 메타데이터 정보를 갖고옴
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);

            //  ROLE_APPLICATION : 일반적으로 사용자가 정의한 빈
            //  ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈
            if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
                Object bean = ac.getBean(beanDefinitionName);
                System.out.println("name = " + beanDefinitionName + " object = " + bean);
            }
        }
    }
}

 

.getBeanDefinition 메서드를 통해 

해당 빈에 대한 메타데이터 정보를 갖고 온 후,

 

.ROLE_APPLICATION을 통해 

애플리케이션 빈(내가 생성한 빈)들만 조회할 수 있다.

 

 

 

 

 

실행 결과는..

 

 

 

 

 

정상적으로 내가 등록한 빈들만 출력이 되는 것을 볼 수 있다.

 

 

 

 

반응형