빈이 여러개 필요한 순간이 있다.
예를 들어 rate DiscountPolicy를 선택할 지 fixed를 선택할 지
그럴 경우, 특정 Bean들의 조회가 필요하다.
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);
}
}
Map으로 저렇게 넣어주면, Map에 필요한 Key인 String은 Map이 해주는 것 같다. getBean(DiscountPolicy.class).toString()이런 식으로..
참고로, Rate나 Fixed 둘다 구현체를 @Component로 등록 했기 때문에 둘다 Bean으로 들어가 있다.
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 discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy");
assertThat(discountService).isInstanceOf(DiscountService.class);
assertThat(discountPrice).isEqualTo(1000);
discountPrice = discountService.discount(member, 20000, "rateDiscountPolicy");
assertThat(discountPrice).isEqualTo(2000);
}
}
테스트
저런 식으로 여러개? AutoAppConfig.class, DiscountService.class 여러 개를 받아서 모두 빈으로 등록할 수 있음.
'스프링 > 1. 스프링 핵심 원리' 카테고리의 다른 글
41강. 빈 생명주기 (0) | 2023.07.23 |
---|---|
40강. 자동, 수동 선택 기준 (0) | 2023.07.23 |
38강. 어노테이션 만들기 (0) | 2023.07.22 |
37강. 자동주입 똑같은 빈이 2개 이상일 시 (0) | 2023.07.22 |
36강. 롬복, 최신 트렌드 (0) | 2023.07.22 |