Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 스프링 핵심 원리
- transaction
- 자바
- kotlin
- http
- spring
- springdatajpa
- AOP
- JPQL
- jpa
- pointcut
- SpringBoot
- Servlet
- 스프링
- Greedy
- 인프런
- Exception
- Spring Boot
- Proxy
- java
- Android
- JDBC
- QueryDSL
- 스프링 핵심 기능
- db
- 알고리즘
- 김영한
- Thymeleaf
- 그리디
- 백준
Archives
- Today
- Total
개발자되기 프로젝트
조회한 빈을 리스트, Map으로 받아보자 본문
- 가끔 해당 타입의 스프링 빈이 다~ 필요한 상황이 있다.
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<>
'인프런 > [인프런] Spring 핵심원리 이해' 카테고리의 다른 글
빈 생명주기 콜백 (0) | 2021.07.30 |
---|---|
스프링 빈 수동 등록 vs 자동 등록 (0) | 2021.07.30 |
@Qualifier, 타입체크, annotaion만들기 (0) | 2021.07.30 |
조회할 빈이 2개 이상일 경우? (0) | 2021.07.30 |
의존관계 주입, lombok (0) | 2021.07.29 |
Comments