ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 빈이 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
Designed by Tistory.