@Qualifier("mainDiscountPolicy") 이렇게 문자로 적으면 컴파일시 타입 체크가 안된다. 애노테이션을 직접 만들어 해결할 수 있다.
package hello.core.annotation;
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)
@Inherited
@Documented
//상단 애노테이션은 인텔리제이->쉬프트 2번->class탭에서 qualifier검색 후 얻을 수 있다.
@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;
}
<aside> 💡 애노테이션에는 상속이라는 개념이 없다. 이렇게 여러 애노테이션을 모아서 사용하는 기능은 스프링이 지원하는 기능이다. @Qualifier 뿐만 아니라 다른 애노테이션들도 함께 조합해서 사용할 수 있다. 단적으로 @Autowired도 재정의 할 수 있다. 물론 스프링이 제공하는 기능을 뚜렷한 목적 없이 재정의하는 것은 유지보수에 혼란을 가중할 수 있다.
</aside>