DiscountPolicy 빈을 지정하기 위한 어노테이션
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier("mainDiscountPolicy")
public @interface MainDiscountPolicy {
}
@Qualifier("minDiscountPolicy")를 붙인 것처럼 동작한다. 이렇게 어노테이션을 만들어서 사용하는 이유는 @Qualifier("minDiscountPolicy")를 직접 붙였을 때 "minDiscountPolicy"가 문자열이라 잘못 타이핑하여 찾기 어려운 오류를 발생 시킬 수 있기 때문이다.
@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy {...}
어노테이션은 상속이라는 개념이 없다. 여러 어노테이션을 모아서 사용하는 기능은 스프링이 지원해주는 기능이다. @Qualifier 뿐만 아니라 다른 어노테이션들도 함께 조합해서 쓸 수 있다. 하나의 예로 @Autowired도 재정의하여 쓸 수 있다. 물론 스프링이 제공하는 기능을 뚜렷한 목적없이 무분별하게 재정의 하는 것은 유지보수에 혼란만 가중시킬 수 있다.