Spring 시리즈는 혼자 공부하며 기록으로 남기고, 만약 잘못 학습 한 지식이 있다면 공유하며 피드백을 받고자 작성합니다.
스프링에 대해 깊게 공부해보고자 인프런의 김영한 강사님께서 강의를 진행하시는 (스프링 핵심 원리 - 기본편) 강의를 수강하며 정리하는 글입니다.
혹여나 글을 읽으시며 잘못 설명된 부분이 있다면 지적 부탁드리겠습니다.
임시로 사용할 DiscountService
public class AllBeanTest {
static class DiscountService {
private final Map<String, DiscountPolicy> policyMap;
private final List<DiscountPolicy> policyList;
public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policyList) {
this.policyMap = policyMap;
this.policyList = policyList;
System.out.println("policyMap = " + policyMap);
System.out.println("policyList = " + policyList);
}
public int discount(Member member, int price, String discountCode) {
DiscountPolicy discountPolicy = policyMap.get(discountCode);
return discountPolicy.discount(member, price);
}
}
}
@Autowired를 생략해도 되고 @RequiredArgsConstructor를 사용해도 된다.테스트 코드
public class AllBeanTest {
@Test
void findAllBean() {
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
DiscountService discountService = ac.getBean(DiscountService.class);
Member member = new Member(1L, "userA", Grade.VIP);
int discount = discountService.discount(member, 10000, "fixDiscountPolicy");
Assertions.assertThat(discountService).isInstanceOf(DiscountService.class);
Assertions.assertThat(discount).isEqualTo(1000);
int rateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy");
Assertions.assertThat(rateDiscountPrice).isEqualTo(2000);
}
}
AutoAppConfig, DiscountService를 등록한다.discountService.discount(member, 10000, ,"fixDiscountPolicy") 이부분이 핵심이다.출력
policyMap = {fixDiscountPolicy=hello.core.discount.FixDiscountPolicy@7e11ab3d, rateDiscountPolicy=hello.core.discount.RateDiscountPolicy@5fa47fea}
policyList = [hello.core.discount.FixDiscountPolicy@7e11ab3d, hello.core.discount.RateDiscountPolicy@5fa47fea]
DiscountPolicy의 하위타입들이 스프링빈에 등록되어져있다."fixDiscountPolicy"가 키값으로 설정되어있어 policyMap.get("fixDiscountPolicy")으로 해당 구현체를 받아올 수 있다."rateDiscountPolicy"도 마찬가지로 discountCode의 파라미터로 넘기면 해당하는 구현체를 받아온다.