![](/images/spirng/Spirng5MVC/spring.png)
목차
의존성 주입
@Autowired
와 @Inject
를 이용해서 의존성을 주입해준다.
@Autowired와 @Inject를 붙일 수 있는 위치
- 생성자
- Setter
- 필드
생성자 주입
생성자를 통해서 의존 관계를 주입하는 방법
스프링 컨테이너가 Bean 을 생성할때 객체의 생성자를 이용해 의존관계를 주입하는 방식입니다. 생성자를 통한 의존성 주입 방식은 스프링에서 가장 권장하는 방식입니다.
생성자를 통한 의존관계 주입은 객체 생성시 단 한번만 호출돼 객체간 의존관계의 불변성이 보장됩니다. 초기화 시점에 의존관계가 설정되고 변경되지 않기 때문에 final
키워드를 사용할 수 있습니다.
또한, 생성자를 통한 의존 관계 주입시 생성자가 1개인 경우 @Autowried
를 생략할 수 있습니다.
@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 주입
Setter 메소드를 이용해 객체의 의존 관계를 주입하는 방법입니다. 변경 가능성이 있는 의존관계에 사용합니다. 값이 초기화 후 의존관게가 변경될 수 있어 final
키워드 사용이 불가능 합니다
@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
를 붙여 의존 객체를 주입합니다.
@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; } }
|