@Qualifier는 스프링이 어떤 bean을 주입해야 하는지 지정해준다.
예를 들어, 같은 타입의 이름만 다른 bean을 두 개 생성했다.
@Configuration
public class AppCtx {
/// 생략 ///
@Bean
public MemberPrinter memberPrinter1() {
return new MemberPrinter();
}
@Bean
public MemberPrinter memberPrinter2() {
return new MemberPrinter();
}
/// 생략 ///
}
MemberPrinter 타입의 bean을 주입받아야 하는 MemberInfoPrinter 클래스다.
public class MemberInfoPrinter {
MemberPrinter memberPrinter;
/// 생략 ///
@Autowired
public void setMemberPrinter(MemberPrinter memberPrinter) {
this.memberPrinter = memberPrinter;
}
}
이러한 상황에서 MemberInfoPrinter타입의 bean을 생성할 때, MemberPrinter를 주입하는 과정에서 오류가 발생한다. 같은 MemberPrinter 타입의 bean인 memberPrinter1, memberPrinter2 중 어떤 bean을 주입해야 하는지 모호하기 때문이다.
이 때, @Qualifier를 사용하면 주입 시의 모호함 문제를 해결할 수 있다.
@Configuration
public class AppCtx {
/// 생략 ///
@Bean
@Qualifier("printer")
public MemberPrinter memberPrinter1() {
return new MemberPrinter();
}
@Bean
public MemberPrinter memberPrinter2() {
return new MemberPrinter();
}
/// 생략 ///
}
public class MemberInfoPrinter {
MemberPrinter memberPrinter;
/// 생략 ///
@Autowired
@Qualifier("printer")
public void setMemberPrinter(MemberPrinter memberPrinter) {
this.memberPrinter = memberPrinter;
}
}
설정 클래스에서 memberPrinter1의 qualifier를 printer로 지정해주었고, MemberPrinter를 주입받는 세터에서 qualifier가 printer인 MemberPrinter를 주입하라고 명시했다.
그런데 아래와 같은 방법은 여전히 모호성 문제가 발생한다. 위와 같이 설정 클래스에서 memberPrinter1 bean의 qualifier를 printer로 지정하였고, 세터에서 MemberPrinter 파라미터의 이름을 printer로 지정해준 상태다.
public class MemberInfoPrinter {
MemberPrinter memberPrinter;
/// 생략 ///
@Autowired
public void setMemberPrinter(MemberPrinter printer) {
this.memberPrinter = printer;
}
}
반대로 설정 클래스에서 설정한 빈의 이름을 MemberInfoPrinter 클래스에서 qualifier로 지정해 주었다. 이때는 오류 없이 동작한다.
아래는 차례로 설정 클래스, MemberInfoPrinter 클래스 코드다.
@Configuration
public class AppCtx {
/// 생략 ///
@Bean
public MemberPrinter memberPrinter1() {
return new MemberPrinter();
}
@Bean
public MemberPrinter memberPrinter2() {
return new MemberPrinter();
}
/// 생략 ///
}
public class MemberInfoPrinter {
MemberPrinter memberPrinter;
/// 생략 ///
@Autowired
@Qualifier("memberPrinter1")
public void setMemberPrinter(MemberPrinter memberPrinter) {
this.memberPrinter = memberPrinter;
}
}
'SPRING' 카테고리의 다른 글
Spring Import Annotation (0) | 2021.04.11 |
---|