TIL/김영한의 스프링 핵심 원리
의존관계 자동 주입(6) - 애노테이션 만들기
minOE
2024. 4. 23. 15:26
728x90
애노테이션 만들기
@Qualifier("mainDiscountPolicy") 이렇게 문자를 적으면 컴파일시 타입 체크가 안된다. 그래서 다음과 같이 애노테이션을 만들어서 문제를 해결할 수 있다.
애너테이션 정의
package com.example.core.annotation; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import java.lang.annotation.*; @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented @Qualifier("mainDiscountPolicy")//@Qualifier만 있어도 될 듯? @Component public @interface MainDiscountPolicy { }@Qualifier("mainDiscountPolicy") 대신 애노테이션 정의한 거 사용 오타나면 컴파일 오류남
@Component @MainDiscountPolicy public class RateDiscountPolicy implements DiscountPolicy{}
생성자 주입@Component //@RequiredArgsConstructor //final이 붙은 필드값에 대해 생성자를 만들어줌 public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository,@MainDiscountPolicy DiscountPolicy discountPolicy){ this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; }
수정자 주입
public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository ; private final DiscountPolicy discountPolicy; @Autowired public DiscountPolicy setDiscountPolicy(@MainDiscountPolicy DiscountPolicy discountPolicy){ return discountPolicy; }
애노테이션에는 상속이라는 개념이 없다. 이렇게 여러 애노테이션을 모아서 사용하는 기능은 스프링이 지원해주는 기능이다.
@Qualifier 뿐만 아니라 다른 애노테이션도 함께 조합해서 사용할 수 있다. 단적으로 @Autowired도 재정의 할 수 있다.
물론 스프링이 제공하는 기능을 뚜렷한 목적 없이 무분별하게 재정의 하는 것은 유지보수에 혼란을 가중할 수 있다.
728x90