의존관계 주입은 크게 4가지 방법이 있다.
- 생성자 주입
- 수정자 주입 (setter 주입)
- 필드 주입
- 일반 메서드 주입
@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;
}
...
}
@Autowired
를 생략해도 자동 주입된다. 물론 스프링 빈에만 해당한다.@Autowired(required = false)
로 사용할 수 있음@Component
public class OrderServiceImpl implements OrderService{
private MemberRepository memberRepository; // final 빠짐
private DiscountPolicy discountPolicy;
@Autowired // 반드시 있어야함.
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
...
}
@Autowired
의 기본 동작은 주입할 대상이 없으면 오류가 발생한다. 주입할 대상이 없어도 동작하게 하려면 @Autowired(required = false)
로 지정하면 된다.@Autowired private MemberRepository memberRepository;
@Autowired private DiscountPolicy discountPolicy;
@Component
public class OrderServiceImpl implements OrderService{
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
...
}
Member
같은 클래스에서 @Autowired
코드를 적용해도 아무 기능도 동작하지 않는다.