@Qualifier("mainDiscountPolicy")
이렇게 문자를 적으면 컴파일시 타입 체크가 안된다. 다음과 같은 애노테이션을 만들어서 문제를 해결할 수 있다.
import org.springframework.beans.factory.annotation.Qualifier;
import java.lang.annotation.*;
// @Qualifier속성에서 해당 정보를 가져옴
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
// @Qualifier 직접 선언
@Qualifier("MainDiscountPolicy")
public @interface MainDiscountPolicy {
}
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;
}
애노테이션에는 상속이라는 개념이 없다.
이렇게 여러 애노테이션을 모아서 사용하는 기능은 스프링이 지원 해주는 기능이다.
@Qulifier 뿐만 아니라 다른 애노테이션들도 함께 조합해서 사용할 수 있다.
단적으로 @Autowired도 재정의 할 수 있다.
물론 스프링이 제공하는 기능을 뚜렷한 목적 없이 무분별하게 재정의 하는 것은 유지보수에 더 혼란만 가중할 수 있다
출처 : 김영한의 스프링
'SPRING > 개발 TIP' 카테고리의 다른 글
[SPRING] 주문금액 집계 프로젝트 실습 part2 (0) | 2021.08.04 |
---|---|
[SPRING] 주문금액 집계 프로젝트 실습 part1 (0) | 2021.08.04 |
[SPRING] SpringBootServletInitializer 란 무엇이고 왜 상속받고 있는가? (0) | 2021.04.19 |
[SPRING] SpringBoot로 완성하는 URL Shortener (1) (0) | 2021.04.16 |
[SPRING] AOP 정리 및 실습 (4) (0) | 2021.04.14 |