본문 바로가기

JAVA

[SPRING] DI시 중복 Bean 오류 해결 방법

1. 조회 대상 빈이 2개 이상일 때  해결방법

@Autowired 필드 명  매칭

@Quilifier -> @Quilifier 끼리 매칭 -> 빈 이름 매칭

@Primary 사용

 

@Autowired 필드 명  매칭

@Autowired 가 여러 개일 때 구체 클래스의 명으로 변경해서 사용합니다.

 

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = rateDiscountPolicy;
    }

 

@Quilifier

추가 구분자를 제공, 주입시 빈 이름을 변경하는 것이 아니라, 추가적으로 구분자를 제공해 줍니다.

 

@Component
@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy {
}

@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {
}

 

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

 

@Primary 

primary로 어노테이션으로 설정된 것을 가져옵니다.

 

@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy{
}

2. 애노테이션 직접 만들기

@Quilifier("...") 는 문자이기 때문에 컴파일시 타입체크가 안되기 때문에 애노테이션을 만들어서 해결할 수 있습니다.

 

quilifier 클래스 탐색해 가져와서 MainDiscountPolicy 애노테이션을 생성해 줍니다.

 

package hello.core.annotation;

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)
@Inherited
@Documented
@Qualifier("mainDiscountPolicy")
public @interface MainDiscountPolicy {
}

 

@Quilifier로  설정할 곳에서 설정해줍니다.

 

@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy {
}

 

@Quilifier를 사용할 곳에서 @MainDiscountPolicy 애노테이션을 사용해 줍니다.

 

@Component
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;
    }
}