스프링 컨테이너에 있는 모든 빈 조회하기

James_·2022년 5월 19일
0

스프링 컨테이너

요즘은 xml로 DI를 주입하는게 아니라 annotation 기반의 자바 클래스를 만들 수 있음.

컨테이너에 있는 모든 빈 조회

현재 어노테이션으로 의존성 주입한 config 클래스이다.

@Configuration
public class AppConfig
{

    private static AppConfig appConfig;

    public static AppConfig getInstance(){
        if(appConfig == null){
            appConfig = new AppConfig();
        }
        return appConfig;
    }
    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }
    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }
    @Bean
    public DiscountPolicy discountPolicy(){
        return new RateDiscountPolicy();
    }


}

test 폴더로 가서 ApplicationContextInfoTest.java를 생성한다.
DisplayName은 JUnit5만 지원 가능하다.

public 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);
        }
    }
}
// 출력
name = appConfigobject = hello.core.AppConfig$$EnhancerBySpringCGLIB$$37c23c80@2a5b3fee
name = memberServiceobject = hello.core.member.MemberServiceImpl@7c1e2a2d
name = memberRepositoryobject = hello.core.member.MemoryMemberRepository@333dd51e
name = orderServiceobject = hello.core.order.OrderServiceImpl@52d645b1
name = discountPolicyobject = hello.core.order.RateDiscountPolicy@2101b44a

현재 주입하고 있는 클래스들을 볼 수 있다.
하지만 위에 내가 주입한 것이 아닌 스프링 컨테이너에서 주입한 클래스들이 뜨게 된다.

애플리케이션에서 내가 주입한 것들만 확인하기

    @Test
    @DisplayName("어플리케이션 빈 출력하기")
    void findApplicationAllBean(){
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);

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

0개의 댓글