그 많은 방법 중에서 왜 생성자 주입을 사용해야 하는지 알아보자.
Constructor Injection@Component
public class OrderServiceImpl implements OrderService{
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired // 생성자가 하나일 경우 생략이 가능하다
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
...
@Component
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository; // final로 미리 오류를 방지
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
Setter InjectionSetter을 통해서 의존 관계를 주입하는 방법이다.public class OrderServiceImpl implements OrderService{
private MemberRepository memberRepository; // final을 사용할 수 없다!
private DiscountPolicy discountPolicy;
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
Field Injection@Component
public class OrderServiceImpl implements OrderService{
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
의존성 주입 방법에는 각각의 장점과 단점이 혼재한다
하지만 최근 트렌드는 생성자 주입을 사용하라고 권장한다.
필드 주입 참조컴파일 단계에서 오류를 잡는다코드가 간결해진다스프링 2.6이하 버전에서만 해당위와 같은 이유들 때문에 기본으로 생성자 주입을 사용한 후, 수정자 주입 방식을 옵션으로 부여하는게 좋다.