DI의 4가지 방법

Lombok을 이용한 생성자 주입

@Component
@RequiredArgsConstructor // final가 붙은 필드를 모아서 생성자를 자동으로 생성
public class OrderServiceImpl implements OrderService {
    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
}

의존 관계의 조회되는 빈이 2개 이상인 경우

@Component
public class OrderServiceImpl implements OrderService{
		
		private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
		// DiscountPolicy는 FixDiscountPolicy, RateDiscountPolicy를 하위 타입으로 가진다.
		// 어떤 것을 생성자에 넣어줘야 할지 모르기 때문에 예외 발생한다.

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, 
														DiscountPolicy discountPolicy) { // 이 부분에서 예외 발생
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
@Component
public class FixDiscountPolicy implements DiscountPolicy {}

@Component
public class RateDiscountPolicy implements DiscountPolicy {}

방법 1. 필드 명 또는 파라미터 명을 빈 이름으로 변경

@Component
public class OrderServiceImpl implements OrderService{
		
		private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, 
														DiscountPolicy rateDiscountPolicy) { 
        this.memberRepository = memberRepository;
        this.discountPolicy = rateDiscountPolicy; // RateDiscountPolicy 의존성 주입
    }

@Autowired