불변
, 필수
의존관계에 사용@Autowired
생략 가능 → 스프링 빈에만 해당public class OrderServiceImpl {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired // 생략 가능
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discount policy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
...
}
선택
, 변경
가능성이 있는 의존관계에 사용public class OrderServiceImpl {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
...
}
참고) @Autowired
의 기본 동작은 주입할 대상이 없으면 오류가 발생한다. 주입할 대상이 없어도 동작하게 하려면 @Autowired(requierd = false)
로 지정한다.
외부에서 변경이 불가능해 테스트하기 어렵다.
DI 프레임워크가 없으면 아무것도 할 수 없다.
사용 가능한 곳
@SpringBootTest
처럼 스프링에 종속적인 테스트에서는 사용 가능@Configuration
같은 곳에서만 사용
⇒ 스프링에 종속적인 코드에서만 가능
public class OrderServiceImpl {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
...
}
public class OrderServiceImpl {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
...
}
참고) 의존관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다. 스프링 빈이 아닌 Member 같은 클래스에서 @Autowired
코드를 적용해도 아무 기능도 동작하지 않는다.