해당 게시물은 인프런 - "스프링 핵심 원리 - 기본편" 강의를 참고하여 작성한 글 입니다
유료강의이므로 자세한 내용은 없고, 간단한 설명 위주로 정리했습니다 강의 링크
생성자를 통해 의존 관계를 주입 받는다
생성자 호출시점에 딱 1번만 호출되는 것이 보장된다
불변, 필수 의존관계에 사용한다
생성자가 딱 1개만 있으면 @Autowired
를 생략해도 자동 주입 된다
대부분의 경우 생성자 주입을 권장한다
대부분의 의존관계 주입은 한 번 일어나면 애플리케이션 종료 시점까지 의존관계를 변경할 일이 없다
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy
discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
setter를 통해 의존관계를 주입한다
선택, 변경 가능성이 있는 의존관계에 사용한다
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
필드에 바로 주입하는 방법이다
DI 프레임워크가 없으면 아무것도 할 수 없어서 사용이 권장되지 않는다
@Component
public class OrderServiceImpl implements OrderService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
}
@Autowired
는 타입(Type)으로 빈을 조회한다
선택된 빈이 2개 이상일 때 문제가 발생한다
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
@Autowired
private DiscountPolicy discountPolicy
위에서는 fixDiscountPolicy
, rateDiscountPolicy
2개 중에 선택할 수 없다
NoUniqueBeanDefinitionException
오류가 발생한다
조회 대상 빈이 2개 이상일 때 해결 방법
@Autowired
는 타입 매칭을 시도하고, 이때 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭한다
@Autowired
private DiscountPolicy rateDiscountPolicy
필드 명이 rateDiscountPolicy
이므로 RateDiscountPolicy 빈이 주입된다
@Qualifer
는 추가 구분자를 붙이는 방법이다
주입시 추가적인 방법을 제공하는 것이지 빈 이름을 변경하는 것은 아니다
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy {}
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
@Qualifier("mainDiscountPolicy") DiscountPolicy
discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
@Primary
는 우선순위를 정한다
@Autowired
시에 여러 빈이 매칭되면 @Primary
가 우선권을 가진다
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}