• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

질문있습니다.

23.12.18 18:54 작성 조회수 98

0

조회한 빈이 모두 필요할 때 List,Map을 이용하는 문제입니다.

 

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.junit.jupiter.api.Test;
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.assertThat;
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;
 System.out.println("policyMap = " + policyMap);
 System.out.println("policies = " + policies);
 }
 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);
 }
 }
}

여기서 policyMap과 List에 주입되는 과정이 이해가 안갑니다. Map은 왜 <String,DiscountPolicy>로 정의했고 List는 <DiscountPolicy>로 정의 했는지, 그리고 여기에 어떻게 Ratediscountpolicy와 Fixdiscountpolicy가 들어갔는지 궁금합니다.

답변 1

답변을 작성해보세요.

1

David님의 프로필

David

2023.12.18

안녕하세요. 이준승님, 공식 서포터즈 David입니다.

스프링부트 내부에서 특정 타입의 빈을 조회하여 주입해 줍니다.

이때, Map, List 등의 타입을 구분하여 그에 맞게 주입될 객체를 준비합니다.

예를 들어, Map의 경우 <String, Object> 형태로 선언하고 특정 타입의 빈을 조회한 후 Map에 적절히 넣고 반환하게 됩니다.

이렇게 반환되는 것을 주입 받으려면 <String, Object> 형태를 가져야 합니다.

이와 관련된 자세한 동작은 아래 메서드들을 살펴봐 주세요:)
DefaultListableBeanFactory.resolveMultipleBeans()

DefaultListableBeanFactory.findAutowireCandidates()

감사합니다.