스프링/1. 스프링 핵심 원리

39강. 모든 빈 조회

sdafdq 2023. 7. 22. 23:12

빈이 여러개 필요한 순간이 있다.

 

예를 들어 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 여러 개를 받아서 모두 빈으로 등록할 수 있음.