DiscountPolicy가 구현체가 전략적으로 여러개 필요할 경우가 있다.(동적으로 선택이 필요할 때)
Table of Content
전체 테스트 코드
package hello.core.autowired;
import hello.core.AutoAppConfig;
import hello.core.discount.DiscountPolicy;
import hello.core.member.Grade;
import hello.core.member.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.List;
import java.util.Map;
import static org.assertj.core.api.Assertions.*;
public class AllBeanTest {
@Test
void findAllBean() {
//given
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
DiscountService discountService = ac.getBean(DiscountService.class);
Member member = new Member(1L, "userA", Grade.VIP);
//when1
int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy");
//then1
assertThat(discountService).isInstanceOf(DiscountService.class);
assertThat(discountPrice).isEqualTo(1000);
//when2
int rateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy");
//then2
assertThat(rateDiscountPrice).isEqualTo(2000);
}
//------------
static class DiscountService {
private final Map<String, DiscountPolicy> policyMap;
private final List<DiscountPolicy> policies;
@Autowired
public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {
this.policyMap = policyMap;
this.policies = policies;
System.out.println("policyMap = " + policyMap);
System.out.println("policies = " + policies);
}
public int discount(Member member, int price, String discountCode) {
DiscountPolicy discountPolicy = policyMap.get(discountCode);
return discountPolicy.discount(member, price);
}
}
}
Java
복사
여러 구현체를 주입받은 DiscountPolicy (Map)
우선 DiscoutService 라는 클래스에서는 Map으로 fixDiscountPolicy, rateDiscountPolicy 두 구현체를 모두 주입받았다.
이후 DiscountPolicy 객체를 통해서 내부의 discount 메소드에 String(discountCode)를 파라미터로 전달하여 그 구현체를 선택하도록 하는 방식이다.
Map으로 각 구현체가 저장되어 key, value 쌍으로 저장되어있기 때문에 key값인 String(여기선 discountCode라는 문자열로 특정)로 구현체를 선택한다. 이를 통해 맵의 key값에 스프링 빈 이름이 저장되는 것을 알 수 있고 원하는 것을 파라미터로 넘겨서 선택하는 것도 가능하다는 것을 알 수 있다.
Related Posts
Search