Blog

[SpringCore] 조회한 빈이 모두 필요할때(동적으로 선택이 필요할 때)

Category
Author
citeFred
citeFred
Tags
PinOnMain
1 more property
DiscountPolicy가 구현체가 전략적으로 여러개 필요할 경우가 있다.(동적으로 선택이 필요할 때)
Table of Content

전체 테스트 코드

package hello.core.autowired; import hello.core.AutoAppConfig; import hello.core.discount.DiscountPolicy; import hello.core.member.Grade; import hello.core.member.Member; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.util.List; import java.util.Map; import static org.assertj.core.api.Assertions.*; public class AllBeanTest { @Test void findAllBean() { //given ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); DiscountService discountService = ac.getBean(DiscountService.class); Member member = new Member(1L, "userA", Grade.VIP); //when1 int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy"); //then1 assertThat(discountService).isInstanceOf(DiscountService.class); assertThat(discountPrice).isEqualTo(1000); //when2 int rateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy"); //then2 assertThat(rateDiscountPrice).isEqualTo(2000); } //------------ static class DiscountService { private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; @Autowired public 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); } } }
Java
복사

여러 구현체를 주입받은 DiscountPolicy (Map)

우선 DiscoutService 라는 클래스에서는 Map으로 fixDiscountPolicy, rateDiscountPolicy 두 구현체를 모두 주입받았다.
이후 DiscountPolicy 객체를 통해서 내부의 discount 메소드에 String(discountCode)를 파라미터로 전달하여 그 구현체를 선택하도록 하는 방식이다.
Map으로 각 구현체가 저장되어 key, value 쌍으로 저장되어있기 때문에 key값인 String(여기선 discountCode라는 문자열로 특정)로 구현체를 선택한다. 이를 통해 맵의 key값에 스프링 빈 이름이 저장되는 것을 알 수 있고 원하는 것을 파라미터로 넘겨서 선택하는 것도 가능하다는 것을 알 수 있다.
Search
 | Main Page | Category |  Tags | About Me | Contact | Portfolio