-
빈이 2개 이상일 경우에 의존관계 주입스프링/스프링 기본이론 2023. 2. 1. 22:03
@Component public class FixDiscountPolicy implements DiscountPolicy{ .... } @Component public class RateDiscountPolicy implements DiscountPolicy{ .... }
위와 같이 DiscountPolicy라는 빈이 2개 이상 존재할 경우에 어떻게 해결하면 좋을지에 대한 3가지 해결책이 존재한다.
1. Autowired에 필드명 매칭
@Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } // 원래 코드 @Autowired private DiscountPolicy rateDiscountpolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = ratediscountPolicy; } // 빈이 2개 이상일 경우의 @Autowired 매칭
Autowired 매칭이란 생성자의 파라미터에 어떤 빈을 주입할 것인지를 입력해주는 것이다.
RateDiscountpolicy의 필드명은 rateDiscountpolicy이기 때문에 필드명을 파라미터로 입력해주면 된다.
2.Quilifier 사용
빈 이름을 바꾸는 것이 아니라 추가적인 옵션을 제공해서 구분하는 것이다.
@Component @Qualifier("fixDiscountPolicy") public class FixDiscountPolicy implements DiscountPolicy{ // 생략 }
@Component @Qualifier("mainDiscountPolicy") public class RateDiscountPolicy implements DiscountPolicy { // 생략 }
RateDiscountPolicy와 FixDiscountPolicy의 클래스 위에 @Qualifier 애노테이션을 만들고 이름을 붙여준다.
@Autowired public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; }
의존관계를 주입 할 생성자에서 선언을 할 때 @Qualifier("(원하는 클래스의 Qulifier명)")을 입력하면 해당 클래스와의 의존관계를 주입해준다.
단점이라면 모든 코드에 @Qualifier를 붙여야한다는 단점이 있다.
3. @Primary 사용
우선 순위를 정하는 방법이다. @Autowired시 여러 빈이 매칭이 되면 @Autowired가 되어있는 빈을 자동으로 주입한다.
@Primary public class RateDiscountPolicy implements DiscountPolicy { // 생략 }
간단하게 @Primary만 지정해주면 된다.
실무에서는 main data를 가져오는 경우가 대다수이기 때문에 메인을 @Primary로 쓰고 보조에는 특별히 이름을 붙이는 등으로 많이 쓰인다고 한다.
'스프링 > 스프링 기본이론' 카테고리의 다른 글
어노테이션을 직접 만들기 (0) 2023.02.01 빈 생명주기 콜백 (0) 2023.02.01 의존관계 자동 주입 (0) 2023.01.31 컴포넌트 스캔 (0) 2023.01.30 @Configuration과 싱글톤 패턴 (0) 2023.01.30