본문 바로가기

제안&정리

[Spring] 동일 타입 여러 빈을 @Primary, @Qualifier 으로 사용하기

주변 지인 분께서 동일한 타입의 여러 Spring Bean이 있는 경우 어떻게 사용을 해야 하는지 물어보셨습니다.

 

회사에서는 @Resource 어노테이션으로 태깅이 되어 있는데 이게 맞는 방법인지 모르겠다고 하셔서

@Primary, @Qualifer 어노테이션을 사용하도록 안내 드렸습니다.

 

@Resource 어노테이션의 단점

필드, 메서드에만 선언할 수 있어 생성자 주입 형태로 사용할 수 없습니다.

아무래도 생성자 주입 형태로 의존성 주입을 하는 것이 테스트 코드 작성 등 여러가지 면에서 낫기 때문에

@Resource 어노테이션은 적절하지 않은 방법입니다.

 

@Primary, @Qualifer 사용법

주로 사용이 되는 Bean에 @Primary 어노테이션을 붙여 별도 @Qualifer 어노테이션 없이 사용하고

필요한 곳에만 @Qualifer 어노테이션을 붙여 사용하면 같은 타입의 빈들을 보다 편리하게 관리할 수 있습니다.

// Configuration 파일
@Bean
@Primary
public Foo foo() {
    ...
}

@Bean("foo2")
public Foo foo2() {
    ...
}

// 사용처
public class Bar {
    public Bar(@Qualifier("foo2") Foo foo) {
        this.foo = foo;
    }
}