[TIL] 의존관계 자동 주입
다양한 의존관계 주입 방법
생성자 주입
- 생성자를 통해서 의존 관계를 주입하는 방법
- 생성자 호출 시점에 딱 한 번만 호출되는 것이 보장된다.
- 불편, 필수 의존관계에 사용
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discouontPolicy;
@Autowired // 생성자가 1개만 있는 경우는 생략 가능
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
수정자 주입(setter 주입)
- setter를 통해서 의존관계를 주입하는 방법
- 선택, 변경 가능성이 있는 의존관계에 사용
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discouontPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
필드 주입
- 필드에 바로 주입
- 외부에서 변경이 불가능하기에 테스트가 힘들다.
@Component
public class OrderServiceImpl implements OrderService {
@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, DiscountRepository discountRepository) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discouontPolicy;
@Autowired // 생성자가 1개만 있는 경우는 생략 가능
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discouontPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
@Component
public class OrderServiceImpl implements OrderService {
@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, DiscountRepository discountRepository) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
정리
생성자 주입
방식을 선택하자
- 대부분 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다.
- 수정자 주입을 사용하면, 메서드를 public으로 열어두어야 하는 단점
조회 대상 빈이 2개 이상
@Autowired
는 타입으로 조회한다.
문제가 되는 경우
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
@Autowired
private DiscountPolicy discountPolicy;
NoUniqueBeanDefinitionException
발생
해결 방법을 알아보자.
@Autowired 필드 명 매칭
- 타입 매칭
- 타입 매칭의 결과가 2개 이상일 때 필드 명, 파라미터 명으로 이름 매칭
// 변경 전
@Autowired
private DiscountPolicy discountPolicy
// 필드 명을 빈 이름으로 변경 후
@Autowired
private DiscountPolicy rateDisountPolicy
@Qualifier 사용
@Qualifier
끼리 매칭- 빈 이름 매칭
NoSuchBeanDefinitionException
발생
빈 동록시 @Qualifier
를 붙여준다.
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
주입 시 @Qualifier
를 붙여주고 등록한 이름을 적어준다.
// 생성자 자동 주입 예시
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
@Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
@Primary 사용
// rateDiscountPolicy가 우선권을 갖는다.
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
Author And Source
이 문제에 관하여([TIL] 의존관계 자동 주입), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ssoyeong/TIL-의존관계-자동-주입저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)