[spring] 같은 타입 스프링빈 모두 출력 (스프링 기본편 by 김영한)

su_y2on·2022년 1월 26일
0

Spring

목록 보기
23/30
post-thumbnail

같은 타입 스프링빈 모두 출력

만약 같은 타입의 빈이 모두 필요한 경우 어떻게 해야할까? 사용자가 결제시에 rateDiscount와 fixDiscount를 선택할 수 있다고 해봅시다. 그러면 스프링빈에 같은 DiscountPolicy타입인 rate, fix 빈을 모두 등록해놓고 동적으로 꺼내써야합니다!


이런 경우 스프링빈을 map이나 list로 스프링빈을 주입받으면 됩니다.

 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) {
          	this.policyMap = policyMap;
          	this.policies = policies;
          }
          
          // 선택한 정책으로 할인 금액 반환
          int discount(Member member, int price, String option){
          	DiscountPolicy discountPolicy = policyMap.get(option);
            
            	return discountPolicy.discount(member, price);
           }
      }
}
        



중요한 부분은 바로 생성자 주입부분 입니다. 이제까지는 하나의 빈만 단순히 넣어주는 것이었는데 필드와 파라미터에 타입을 Map과 List로 하면서 다중으로 여러개의 빈을 받아드릴 수 있게 되었습니다. 맵과 리스트 두가지 방법으로 담을 수 있지만 빈의 이름을 key로 그리고 빈을 value에 넣어주는 Map이 가져다 쓸때 더 유용할 것같습니다 :)

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

0개의 댓글