Spring Basic - @Autowired, @Quilifier, @Primary

mmm·2023년 3월 24일
0

조회 대상 빈이 2개 이상일 경우 해결 방법

  • @Autowired 필드 명 매칭
    1. 타입 매칭 → 이때 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭
    2. 타입 매칭 결과가 2개 이상일 경우 필드 명, 파라미터 명으로 빈 이름 매칭
  • @Qualifier@Qualifier 끼리 매칭 → 빈 이름 매칭
    • 추가 구분자를 붙여주는 방법 → 추가 구분자를 찾지 못하면, 그 이름을 가지는 스프링 빈을 찾음

    • 추가 구분자, 스프링 빈 매칭 모두 실패 시 NoSuchBeanDefinitionException 예외 발생

      @Component
      @Qualifier("mainDiscountPolicy")
      public class RateDiscountPolicy implements DiscountPolicy{
          private int discountPercent = 10;
          @Override
          public int discount(Member member, int price) {
              if (member.getGrade() == Grade.VIP){
                  return price * discountPercent / 100;
              } else {
                  return 0;
              }
          }
      }
      @Autowired
      public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy DiscountPolicy) {
          this.memberRepository = memberRepository;
          this.discountPolicy = DiscountPolicy;
      }
  • @Primary 사용
    • 우선 순위를 정하는 방법

    • @Autowired 시 여러 빈이 매칭되면 @Primary가 우선권을 가짐

      @Component
      @Primary
      public class RateDiscountPolicy implements DiscountPolicy{
          private int discountPercent = 10;
          @Override
          public int discount(Member member, int price) {
              if (member.getGrade() == Grade.VIP){
                  return price * discountPercent / 100;
              } else {
                  return 0;
              }
          }
      }

우선 순위

스프링은 자동보다 수동, 넓은 범위의 선택권 보다는 좁은 범위의 선택권이 우선 순위가 높다.

@Primary 는 기본값 처럼 동작, @Qualifier는 상세하게 동작한다

@Qualifier의 우선 순위가 더 높다.

profile
mmm

0개의 댓글