@Qualifier("mainDiscountPolicy") 이렇게 문자를 적으면 컴파일 시 타입 체크가 안된다.
다음과 같은 애노테이션을 만들어서 문제를 해결할 수 있다.
@Target({ElementType.FIELD,
ElementType.METHOD,
ElementType.PARAMETER,
ElementType.TYPE,
ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier("mainDiscountPolicy")
// @MainDiscountPolicy을 사용하면 위에 해당하는 어노테이션이 다 실행된다.
public @interface MainDiscountPolicy {
}
인터페이스 - DiscountPolicy
구현체 - RateDiscountPolicy , FixDiscountPolicy
이 중 RateDiscountPolicy를 MainDiscountPolicy라고 지정할려고 한다.
OrderServiceImpl
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(MemberRepository memberRepository,
@MainDiscountPolicy DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
RateDiscountPolicy
@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy{
...
}
@MainDiscountPolicy가 실행 되면. @Qualifier가 실행 되므로 @MainDiscountPolicy가 작성된 것 끼리 서로 연결된다.
이렇게 여러 애노테이션을 모아서 사용하는 기능은 스프링이 지원해주는 기능이다.
물론 스프링이 제공하는 기능을 뚜렷한 목적 없이 무분별 하게 재정의 하는 것은 유지보수에 더 혼란만 가중할 수 있다.
+
@Target
해당 애노테이션이 어디에 사용 될 수 있는가를 명시한다.
@Retention(RetentionPolicy.RUNTIME)
어느 시점까지 애노테이션의 메모리를 가져갈지 설정
애노테이션을 런타임시에까지 사용할 수 있습니다.
JVM이 자바 바이트코드가 담긴 class 파일에서 런타임환경을 구성하고 런타임을 종료할 때까지 메모리는 살아있습니다.
Annotation 직접 만들기
@Qualifier에 대해
의존성 주입 애노테이션
@Autowired 스프링 프레임워크에서 제공하는 애노테이션이다. @Autowired는 타입 매칭을 시도 하고 , 여러 빈이 있으면 필드 이름(파라미터 이름)으로 빈 이름을 추가 매칭한다. ac.getBean(클래스.class)
write-read.tistory.com
@Qualifier("mainDiscountPolicy") 이렇게 문자를 적으면 컴파일 시 타입 체크가 안된다.
다음과 같은 애노테이션을 만들어서 문제를 해결할 수 있다.
인터페이스 - DiscountPolicy
구현체 - RateDiscountPolicy , FixDiscountPolicy
이 중 RateDiscountPolicy를 MainDiscountPolicy라고 지정할려고 한다.
OrderServiceImpl
RateDiscountPolicy
+
출처
스프링 핵심 원리 - 기본편 - 인프런
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. 초급 프레임워크 및 라이브러리 웹 개발 서버 개발 Back-End Spring 객체지향 온
www.inflearn.com
'기록 > Spring' 카테고리의 다른 글