티스토리 뷰
Map, List를 이용하면 스프링 빈에 등록되어 있는 구현체들을 조회할 수 있다.
이를 통해 다형성 있는 프로그램을 작성해보자.
먼저, Map과 List에 스프링 빈에 담긴 구현체를 모두 가져오는 방법은 다음과 같다.
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);
}
출력해보면,
Type이 일치하는 구현체들(DiscountPolicy라는 interface를 구현하고, 스프링 빈에 등록되어 있는 애들)이 모두 담겨져 나온다.
이것을 활용하면 다형성 있는 코드를 작성할 수 있다.
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 amount, String discountCode) {
DiscountPolicy discountPolicy = policyMap.get(discountCode);
return discountPolicy.discount(member, amount);
}
}
@Test
public void findAllBean(){
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class,DiscountService.class);
DiscountService discountService = ac.getBean(DiscountService.class);
Member member = new Member(1L, "userA", Grade.VIP);
int discount = discountService.discount(member, 20000, "rateDiscountPolicy");
Assertions.assertThat(discount).isEqualTo(2000);
}
Test 코드를 보면 클라이언트가 discountPolicy를 원하는 대로 선택할 수 있다. (rate discount 혹은 fixed discount)
그리고 위에 있는 discount( ) 코드는 discountPolicy가 rate discount 인지 아니면 fixed discount 인지 몰라도 된다. 다시 말해 interface 인 discountPolicy만 알고 있는 채로 작업을 수행한다. 다형성이 지켜진 코드다. 이는 Map에 등록되어 있는 bean 정보를 불러오고, bean 이름과 클라이언트의 argument 이름을 일치시켰기에 가능했다.
이처럼 List, Map과 스프링 bean을 활용하면 다형성 있는 코드를 작성할 수 있다~!
사진, 내용 출처 : 인프런, 김영한 강사님의 '스프링 핵심 원리 - 기본편' 강좌, 강의자료
'SPRING' 카테고리의 다른 글
프로토타입 스코프 (0) | 2021.05.20 |
---|---|
빈 생명주기 콜백 (init, cleanup) (0) | 2021.05.20 |
의존관계 주입 시 스프링 빈이 2개 이상 조회될 때 (feat. @Qualifier, @Primary) (0) | 2021.05.18 |
의존관계 주입 방법 (0) | 2021.05.17 |
컴포넌트 스캔 (0) | 2021.05.16 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 예외처리
- java
- 디자인패턴
- gracefulshutdown
- 프로그래머스
- ec2
- c++
- 서비스추상화
- BOJ
- 객체지향
- 카카오
- 토비의스프링
- 토비
- 프록시
- 자바스터디
- 템플릿콜백
- 토비의봄TV
- 프록시패턴
- 자바
- SOLID
- provider
- 스프링
- 코딩테스트
- OOP
- 김영한
- AOP
- 메서드레퍼런스
- 코테
- 백기선
- 데코레이터패턴
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함