728x90
@Qualifier("mainDiscountPolicy") 이렇게 문자를 적으면 컴파일시 타입 체크가 안된다.
다음과 같은 애노 테이션을 만들어서 문제를 해결할 수 있다.
Annotation 직접 만들기
순서1. 자바 클래스를 어노테이션으로 생성해준다.
순서2. @Qualifier를 Annotation으로 만들 것이기 때문에 @Qualifier에 들어가서 위에 부분을 복사해온다.
순서3. 만들고자 했던 Annotation인 @MaindiscountPolicy에 붙여넣는다.
@Qualifier도 사용할 것이기 때문에 추가해준다.
package hello.core.annotataion;
import org.springframework.beans.factory.annotation.Qualifier;
import java.lang.annotation.*;
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Qualifier("mainDiscountPolicy") // @Qualifier도 사용할 것이기 때문에 추가해준다.
public @interface MainDiscountPolicy {
}
순서 4. Annotaiton 사용
위에서 만든 Annotation인 @MainCiscountPolicy를 사용하고자 하는 곳에 쓰면 된다.
@Qualifier 등록
@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy {}
@Qualifier 사용
//생성자 자동 주입
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
@MainDiscountPolicy DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
//생성자 자동 주입
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
@MainDiscountPolicy DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
애노테이션에는 상속이라는 개념이 없다.
이렇게 여러 애노테이션을 모아서 사용하는 기능은 스프링이 지원해주는 기능이다.
@Qualifier 뿐만 아니라 다른 애노테이션들도 함께 조합해서 사용할 수 있다.
단적으로 @Autowired 도 재정의 할 수 있다.
물론 스프링이 제공하는 기능을 뚜렷한 목적 없이 무분별하게 재정의 하는 것은 유지보수에 더 혼란만 가중할 수 있다.
'공부 > Spring' 카테고리의 다른 글
[Spring] 자동 빈, 수동 빈의 올바른 실무 운영 기준(언제 자동빈, 수동빈 사용할까?) (1) | 2023.12.31 |
---|---|
[Spring] 조회한 빈이 모두 필요할 때, List, Map (1) | 2023.12.30 |
[Spring] 조회 빈이 2개 이상일 때(오류) - @Autowired 필드 명, @Qualifier, @Primary (0) | 2023.12.28 |
[Spring] 롬복과 최신 트랜드(롬복 라이브러리 설치) (0) | 2023.12.20 |
[Spring] 생성자 주입을 선택해라! (0) | 2023.12.20 |