의존 관계 자동 주입 - 조회 빈 모두 사용

박찬우·2023년 12월 17일
0

스프링

목록 보기
20/88

조회한 모든 빈 사용하기

  • 동적으로 빈을 바꾸며 사용해야 하는 경우 사용함
  • List, Map 이용
  • 모든 종류의 빈을 다 가져옴
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);
    }

    static class DiscountService {
        private final Map<String, DiscountPolicy> policyMap;
        private final List<DiscountPolicy> policies;

        public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {
            // DiscountPolicy로 조회한 모든 빈을 넣어줌
            this.policyMap = policyMap;
            this.policies = policies;
            System.out.println("policyMap = " + policyMap);
            System.out.println("policies = " + policies);
        }

        // discountCode 파라미터로 빈의 명을 입력받아서 필요한 빈을 사용
        public int discount(Member member, int price, String discountCode) {
            DiscountPolicy discountPolicy = policyMap.get(discountCode);
            System.out.println("discountCode = " + discountCode);
            System.out.println("discountPolicy = " + discountPolicy);
            return discountPolicy.discount(member, price);
        }
    }
}

profile
진짜 개발자가 되어보자

0개의 댓글