ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 빈 조회-상속관계
    FrameWork/Spring&Spring-boot 2022. 1. 2. 15:58
    • 부모 타입으로 조회하면, 자식 타입도 함께 조회한다.
    • 그래서 모든 자바 객체의 최고 부모인'Object'타입으로 조회하면, 모든 스프링 빈을 조회한다.

     

     

     

    @Test
    @DisplayName("부모 타입으로 조회시,자식이 둘 이상 있으면,중복 오류가 발생한다.")
    void findBeanByParentTypeDuplicate(){
        assertThrows(NoUniqueBeanDefinitionException.class,
                () -> ac.getBean(DiscountPolicy.class));
    }

     

    @Test
    @DisplayName("부모 타입으로 조회시,자식이 둘 이상 있으면,이상 있으면, 빈 이름을 지정하면된다.")
    void findBeanByParentTypeDuplicateBeanName(){
      DiscountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy",DiscountPolicy.class);
      assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);
    }

     

     

    @Test
    @DisplayName("특정 하위 타입을 조회회")
    void findBeanBySubType(){
        RateDiscountPolicy bean = ac.getBean(RateDiscountPolicy.class);
        assertThat(bean).isInstanceOf(RateDiscountPolicy.class);
    }

     

    @Test
    @DisplayName("부모 타입으로 모두 조회하기")
    void findAllBeanByPrentType(){
        Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.class);
    
        for(String key : beansOfType.keySet()){
            System.out.println("key:"+key+"value:"+beansOfType.get(key));
        }
    
        assertThat(beansOfType.size()).isEqualTo(2);
    
    }

    Tip

     출력하는 것은 공부하는 용도로 출력하는 것 실제 Test케이스를 만들때는 출력문을 만들면 안된다.

    왜냐하면, 자동 통과를 시스템이 결정하도록 해야하기 때문에, 일일히 출력해서 눈으로 확일 할 수는 없다.

    그래서 Test가 pass인지 아닌지를 판별한는 방식으로 Test 코드를 짜야한다.

     

    @Test
    @DisplayName("부모타입으로 모두 조회하기-Object")
    void findAllBeanObjectType(){
    
        Map<String, Object> beansOfType = ac.getBeansOfType(Object.class);
    
        for(Object key: beansOfType.keySet()){
            System.out.println("key:"+key+"value:"+ beansOfType.values());
        }

     

    두가지 경우의 차이점

    @Bean
    public RateDiscountPolicy rateDiscountPolicy(){
        return new RateDiscountPolicy();
    }

    ↓↓↓↓↓↓↓↓

    @Bean
    public DiscountPolicy rateDiscountPolicy(){
        return new RateDiscountPolicy();
    }

     

    역할구현을 쪼개는 것

     

     

    예를들어 Orderservice를 개발한다고 치면,

    public class OrderServiceImpl implements OrderService {
    
        private final MemberRepository memberRepository;
        private final DiscountPolicy discountPolicy;
    
        public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy){
            this.memberRepository = memberRepository;
            this.discountPolicy = discountPolicy;
        }

    위 코드만 개발을 하고 의존관계는 명시 하지 않는다. 

    왜냐하면,

    -> 그부분은 AppConfig에서 적어주기 때문이다.

     

    +스프링 컨테이너를 통해서 Bean을 조회하는 code가 없다.

    즉 ->실제 개발을 할때는 applicationContext에서 Bean을 조회할 일은 거의 없다.

    +"부모 타입으로 조회시, 자식이 어디까지 조회가 가능한지"알고 있어야,

    나중에 자동 의존 관계 주입이런 경우 잘 해결 할 수 있다.

     

    [출처 : 김영한. 스프링 핵심 원리-기본편. 인프런]

     

     

    댓글

Designed by Tistory.