@Qualifier("mainDiscountPolicy")
이렇게 문자를 적으면 컴파일시 타입 체크가 안됩니다. 다음과 같은 애노테이션을 만들어서 문제를 해결할 수 있습니다.
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier("mainDiscountPolicy")
public @interface MainDiscountPolicy {
}
@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy {
...
}
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
@Autowired
public DiscountPolicy setDiscountPolicy(@MainDiscountPolicy DiscountPolicy discountPolicy) {
return discountPolicy;
}
애노테이션에는 상속이라는 개념이 없습니다. 이렇게 여러 애노테이션을 모아서 사용하는 기능은 스프링이 지원해주는 기능입니다. @Qualifier 뿐만 아니라 다른 애노테이션들도 함께 조합해서 사용할 수 있습니다. 단적으로 @Autowired도 재정의 할 수 있습니다. 물론 스프링이 제공하는 기능을 뚜렷한 목적 없이 무분별하게 재정의 하는 것은 유지보수에 더 혼란만 가중할 수 있습니다.
참조
'Spring' 카테고리의 다른 글
[스프링 핵심 원리 - 기본편] 자동, 수동의 올바른 실무 운영 기준 (0) | 2021.09.20 |
---|---|
[스프링 핵심 원리 - 기본편] 조회한 빈이 모두 필요할 때, List, Map (0) | 2021.09.20 |
[스프링 핵심 원리 - 기본편] @Autowired 필드 명, @Qualifier, @Primary (0) | 2021.09.20 |
[스프링 핵심 원리 - 기본편] 조회 빈이 2개 이상 - 문제 (0) | 2021.09.20 |
[스프링 핵심 원리 - 기본편] 롬복과 최신 트랜드 (0) | 2021.09.20 |
댓글