-
스프링 빈 조회-상속관계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을 조회할 일은 거의 없다.
+"부모 타입으로 조회시, 자식이 어디까지 조회가 가능한지"알고 있어야,
나중에 자동 의존 관계 주입이런 경우 잘 해결 할 수 있다.
[출처 : 김영한. 스프링 핵심 원리-기본편. 인프런]
'FrameWork > Spring&Spring-boot' 카테고리의 다른 글
다양한 설정 형식 지원 - 자바 코드, XML (0) 2022.01.09 BeanFactory와 ApplicationContext (0) 2022.01.09 스프링 빈 조회 - 동일한 타입이 둘 이상 (0) 2022.01.01 스프링 빈 조회 - 기본☆ (0) 2022.01.01 컨테이너에 등록된 모든 빈 조회 (0) 2022.01.01