• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

의존관계 자동 주입 - 조회한 빈이 모두 필요할 때, List, Map

21.03.06 16:59 작성 조회수 217

0

안녕하세요 영한님 제목에 있는 강의를 듣던 도중 궁금 한 것이 생겨 질문 남깁니다.

다름이아니라 아래와 같이 코드를 구성하였을 때 DiscountService는 AnnotationConfigApplicationContext에 넣어줌으로써 Bean으로 등록 된다는 것은 이해가 됩니다. 하지만 DiscountService 클래스에 있는 policyMap 과policyList는 제 생각으로는 아무것도 등록이 안되어있는 것이 맞을 텐데 어떻게 FixDiscountpolicy와 RateDiscountPolicy가 들어가는지 이해가 잘 되지 않습니다. 이 필드들은 각각 Map과 List이고 제네릭(?)만 DiscountPolicy 인데 

스프링 컨테이너가 "음 Map 과 List 가 DiscountPolicy로 표현이 되었네?  그럼 내가 DiscountPolicy 타입으로 된 Bean이 있나?  아 ! AutoAppConfig에서 ComponentScan으로 해보니까 FixDiscountpolicy, RateDiscountPolicy가 있네? 그럼 그냥 이거 넣어야 겠다." 이런  메커니즘으로 동작하는 것인가요?

답변 1

답변을 작성해보세요.

2

안녕하세요. fightnyy님

AutoAppConfig를 통해서 이미 스프링이 FixDiscountpolicy와 RateDiscountPolicy를 스프링 빈으로 다 등록해 둡니다.

스프링은 Map이나 List의 경우에는 약간 특수한 처리를 합니다.

fightnyy님이 생각하셨던 것 처럼 다음 메커니즘으로 동작합니다^^

스프링 컨테이너가 "음 Map 과 List 가 DiscountPolicy로 표현이 되었네?  그럼 내가 DiscountPolicy 타입으로 된 Bean이 있나?  아 ! AutoAppConfig에서 ComponentScan을 통해서 이미 FixDiscountpolicy, RateDiscountPolicy를 스프링 빈으로 등록해두었으니 이걸 사용해야 겠구나. 라고 처리가 됩니다.

감사합니다.

fightnyy님의 프로필

fightnyy

질문자

2021.03.07

영한님 그럼 추가 질문 드리자면 String, Long, List 같은 자바에서 이미 구현된 Class 들에 대해서는 스프링 컨테이너가 별도로 Bean으로 만들지 않는것인가요?

수도 코드로 설명드리자면

if (java 언어 내에서 구현된 Class이면):

    Bean으로 등록안함

else : /*사용자가 만든클래스*/

    Bean으로 등록함

이런식으로 컨테이너가 구성되어 있는것인가요?