@Qualifier("mainDiscountPolicy") 처럼 별칭을 문자열로 작성하면 컴파일 시 타입 체크가 안된다. 즉, 애플리케이션이 실행되고 해당 코드가 동작해야 오류를 알 수가 있다. 이러한 경우 직접 애노테이션을 만들어서 해결할 수 있다.

애노테이션 생성

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")
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 DiscountPolicydiscountPolicy) {
    this.discountPolicy = discountPolicy;
}