공부/Spring

[Spring] Annotation 직접 만들기

sesam 2023. 12. 29. 14:33
728x90

@Qualifier("mainDiscountPolicy") 이렇게 문자를 적으면 컴파일시 타입 체크가 안된다.

다음과 같은 애노 테이션을 만들어서 문제를 해결할 수 있다.

 

Annotation 직접 만들기

순서1. 자바 클래스를 어노테이션으로 생성해준다.

 

순서2. @Qualifier를 Annotation으로 만들 것이기 때문에 @Qualifier에 들어가서 위에 부분을 복사해온다.

 

순서3. 만들고자 했던 Annotation인 @MaindiscountPolicy에 붙여넣는다.

@Qualifier도 사용할 것이기 때문에 추가해준다.

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") // @Qualifier도 사용할 것이기 때문에 추가해준다.
public @interface MainDiscountPolicy {
}

 

순서 4. Annotaiton 사용

위에서 만든 Annotation인 @MainCiscountPolicy를 사용하고자 하는 곳에 쓰면 된다.

 

@Qualifier 등록

@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy {}

 

 

@Qualifier 사용

//생성자 자동 주입
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
 @MainDiscountPolicy DiscountPolicy discountPolicy) {
     this.memberRepository = memberRepository;
     this.discountPolicy = discountPolicy;
}

 

//생성자 자동 주입
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
 @MainDiscountPolicy DiscountPolicy discountPolicy) {
     this.memberRepository = memberRepository;
     this.discountPolicy = discountPolicy;
}

 

 


 

 

애노테이션에는 상속이라는 개념이 없다.

이렇게 여러 애노테이션을 모아서 사용하는 기능은 스프링이 지원해주는 기능이다.

@Qualifier 뿐만 아니라 다른 애노테이션들도 함께 조합해서 사용할 수 있다.

단적으로 @Autowired 도 재정의 할 수 있다.

물론 스프링이 제공하는 기능을 뚜렷한 목적 없이 무분별하게 재정의 하는 것은 유지보수에 더 혼란만 가중할 수 있다.

728x90