DiscountPolicy라는 동일 타입의 빈인 RateDiscountPolicy, FixDiscountPolicy를 모두 가져와 동적으로 사용하고 싶은 경우는 어떻게 할까?

=> List, Map에 빈을 담아와서 필요할 때 꺼내서 사용

 

public class AllBeanTest {

    @Test
    public void findAllBean() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
        DiscountService discountService = ac.getBean(DiscountService.class);

        Member member = new Member(1, "memberA", Grade.VIP);

        int discountPrice = discountService.discount(member, 25000, "rateDiscountPolicy");

        Assertions.assertThat(discountPrice).isEqualTo(2500);
    }

    static class DiscountService {

        // 여러개의 빈이 모두 필요
        private final Map<String, DiscountPolicy> dcPolicyMap;
        private final List<DiscountPolicy> dcPolicyList;

        public DiscountService(Map<String, DiscountPolicy> dcPolicyMap, List<DiscountPolicy> dcPolicyList) {
            this.dcPolicyMap = dcPolicyMap;
            this.dcPolicyList = dcPolicyList;
        }

        public int discount(Member member, int price, String discountCode) {
            DiscountPolicy discountPolicy = dcPolicyMap.get(discountCode);
            return discountPolicy.discount(member, price);
        }

    }

}