Free Lines Arrow
본문 바로가기
Spring/spring 기초 스터디

[Spring] Spring Bean 값 조회 하기

by skahn1215 2021. 4. 28.
728x90
반응형

앞서 스프링에 등록한 Bean 값들을 조회해 보자

 

등록한 Bean 정보들

@Configuration
public class AppConfig {

    // 여기서 DI를 해줌
    // DI를 해줌으로써 역할과 구현이 분리됨.

    @Bean //@Bean 입력시 스프링 컨테이너에 등록됨.
          //등록시 이름이 등록되는데 해당 이름은 메소드 이름이다. memberService
          // Key: memberService, value 객체
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    // memory에서 다른 DB로 변경될 경우 해당 코드만 변경하면 됨.
    @Bean
    public MemberRepository memberRepository() {
        return new MemberMemoryRepository();
    }

    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(new MemberMemoryRepository(), discountPolicy());
    }

    @Bean
    public DiscountPolicy discountPolicy() {
        // FixDiscountPolicy -> RateDiscountPolicy로 변경.
        //return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }

}

 

 

 

 

bean값 출력

public class AnnotationContextInfo {

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    void findAllBean() {
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            Object bean = ac.getBean(beanDefinitionName);
            System.out.println("name =" + beanDefinitionName + "bean = " + bean);
        }
    }

    @Test
    @DisplayName("모든 빈 출력하기")
    void findApplicationBean() {
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames){
            //Object bean = ac.getBean(beanDefinitionName);
            //System.out.println("name =" + beanDefinitionName + "bean = " + bean);

            //bean 하나의 메타 definition을 가져온다.
             BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
             
             // 내가 어플리케이션을 개발하려고 등록한 빈들만 출력
             if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
                 Object bean = ac.getBean(beanDefinitionName);
                 System.out.println("name =" + beanDefinitionName + "bean = " + bean);
             }
        }
    }
}

 

findAllBean()

1. getBeanDefinitionNames함수로 정의된 bean들을 가져와 string 배열로 받는다.

2. Object bean = ac.getBean(beanDefinitionName); 빈 오브젝트를 가져온다. 

 

findApplicaiontBean()

1. findAllBean과 다른점은 ROLE_APPLICATION으로 사용자가 정의한 빈만 출력하게 했다.

 

 

 

 

기본적인 Bean 조회 방법들

package hello.core.beanfind;

import hello.core.AppConfig;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
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 ApplicationContextBasicFindText {
    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() {
        MemberService memberService = ac.getBean("memberService", MemberService.class);
        assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
    }
    @Test
    @DisplayName("빈 이름으로 조회X")
    void findBeanByNameX() {
//        ac.getBean("xxxxx", MemberService.class)
        // 일부러 없는 케이스를 만듬.
        assertThrows(NoSuchBeanDefinitionException.class,
                ()->ac.getBean("xxxxx", MemberService.class));
    }


}

 

 

 

 

 

참고: www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/lecture/55364?tab=note

 

스프링 핵심 원리 - 기본편 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

728x90
반응형

댓글