↩뒤로가기

의도적으로 정말 해당 타입의 빈이 다 필요한 경우도 있다.

예를 들어 할인 서비스를 제공하는데, 클라이언트가 할인의 종류(rate, fix)를 선택할 수 있다고 가정해보자. 스프링을 사용하면 소위 말하는 패턴 전략을 간단히 구사할 수 있다.

package hello.core.autowired;

import hello.core.AutoAppConfig;
import hello.core.discount.DiscountPolicy;
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;

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;

//생성자 호출 시 DiscountPolicy타입의 맵 객체, DiscountPolicy 타입의 리스트 객체를 받는다.
    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);
//discountCode를 받아 맵 객체에서 할인정책의 종류를 주입한다.

        System.out.println("discountCode = " + discountCode);
        System.out.println("discountPolicy = " + discountPolicy);

//DiscountPolicy 클래스의 discount메소드를 호출한 결과값 리턴
        return discountPolicy.discount(member, price);
      }

    }
}

로직 분석

주입 분석

결과

policyMap = {fixDiscountPolicy=hello.core.discount.FixDiscountPolicy@54d18072, rateDiscountPolicy=hello.core.discount.RateDiscountPolicy@1506f20f} policies = [hello.core.discount.FixDiscountPolicy@54d18072, hello.core.discount.RateDiscountPolicy@1506f20f]