Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

조회한 빈을 리스트, Map으로 받아보자 본문

인프런/[인프런] Spring 핵심원리 이해

조회한 빈을 리스트, Map으로 받아보자

Seung__ 2021. 7. 30. 17:06
  • 가끔 해당 타입의 스프링 빈이 다~ 필요한 상황이 있다.

1. AllBeanTest


  • @Autowired 통해 DiscountPolicy 타입에 해당하는 스프링 빈을 받고,
    출력하는 service를 작성
  • 설정 클래스는 AutoAppConfig와 DiscountService를 등록
  • 어? DiscountService를,, 설정파일..로..? --> Component class로 등록임
  • Component scan에 의해 DiscountService도 스프링 빈으로 등록됨
    Create a new AnnotationConfigApplicationContext, 
    deriving bean definitions from the given component classes 
    and automatically refreshing the context.​
    	public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
    		this();
    		register(componentClasses);
    		refresh();
    	}​
  • 코드를 실행하면 policyMap에는 해당하는 스프링 빈 이름 & 스프링 빈이 매핑이 될 것.
  • 또한 DiscountPolicy에 해당하는 스프링 빈을 리스트로 받는다.
@Component
public class AllBeanTest {

    @Test
    void findAllBean(){
        ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);

    }

    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);
        }
    }
}

해당 타입에 해당하는 스프링 빈을 map, list로 받아왔다.

policyMap = {fixDiscountPolicy=hello.core.discount.FixDiscountPolicy@37ddb69a, 
			rateDiscountPolicy=hello.core.discount.RateDiscountPolicy@349c1daf}
policies = [hello.core.discount.FixDiscountPolicy@37ddb69a,
			hello.core.discount.RateDiscountPolicy@349c1daf]

 

 

2. 스프링 빈을 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");

        Assertions.assertThat(discountService).isInstanceOf(DiscountService.class);
        Assertions.assertThat(discountPrice).isEqualTo(1000);

        int rateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy");
        Assertions.assertThat(rateDiscountPrice).isEqualTo(2000);
    }

    @Component
    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);
        }
    }
}

 

  • 로직분석
    - DiscountService는 Map으로 모든 DiscountPolicy 빈을 주입받는다. 
    -  fixcDiscountPolicy, rateDiscountPolicy가 주입된다.
    - discount() 메서드는, dicountCode로 넘겨 받는 대로 map에서 해당 DiscountPolicy 빈을 찾아서 실행.
  • 주입 분석
    - Map<String, DiscountPolicy> : key에 스프링 빈 이름, value에 DiscountPolicy 타입의 빈으로 조회한 빈 모두
    - List<DiscountPolicy> : 해당 타입으로 조회한 빈 모두 담음/.

 

3. GitHub : 210730 Spring bean + Map<>


 

 

GitHub - bsh6463/SpringCoreFunction

Contribute to bsh6463/SpringCoreFunction development by creating an account on GitHub.

github.com

 

Comments