조회한 빈 모두 사용하기

이연희·2022년 2월 5일
0

Spring

목록 보기
38/105

List, Map

🔹 DiscountService는 Map으로 모든 DiscountPolicy를 주입받는다. fixDiscountPolicy와 rateDiscountPolicy가 주입된다.
🔹 discount()는 discountCode로 넘어온 빈 이름을 map에서 찾아서 실행시킨다.
🔹 Map<String, DiscountPolicy>: 키에 스프링 빈 이름을 넣고 그 값으로 DiscountPolicy 타입으로 조회한 모든 스프링 빈을 담아둔다.
🔹 List<DiscountPolicy>: DiscountPolicy 타입으로 조회한 모든 스프링 빈을 담아둔다.
🔹 만약 해당하는 타입의 스프링 빈이 없으면 빈 컬렉션이나 Map을 주입한다.

public class AllBeanTest {
    static class DiscountService{
        private final Map<String, DiscountPolicy> policyMap;
        private final List<DiscountPolicy> policies;
        @Autowired
        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);
        }
    }
}

🔸 테스트 코드

@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");
	Assertions.assertThat(discountService).isInstanceOf(DiscountService.class);
    Assertions.assertThat(discountPrice).isEqualTo(1000);

    int rateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy");
    Assertions.assertThat(rateDiscountPrice).isEqualTo(2000);
}
profile
공부기록

0개의 댓글