동방프로젝트

@Qualifier 어노테이션

두원공대88학번뚜뚜 2021. 1. 15. 03:48

자동 주입 가능한 빈이 2개 이상일 때, 자동 주입할 빈을 선택할 필요가 있다. 이떄 쓰는게 Qualifier.

이는 우선, @Bean 어노테이션을 붙인 빈 설정 메서드에서 쓰인다.

@Bean
@Qualifier("printer")
	public MemberPrinter memberPrinter1() {
		return new MemberPrinter();
}
@Bean
	public MemberPrinter memberPrinter2() {
		return new MemberPrinter();
	}

이 설정은 해당 빈의 한정 값으로 printer을 지정

 

또는

public class MemberListPrinter {
....

@Autowired
@Qualifier("printer")
public void setMemberPrinter(MemberPrinter printer) {
	this.printer=printer;
    }
}

에 쓰이기도 한다.  이 경우엔, MemberPinter타입의 빈을 setMemberPrinter에 자동주입한다.

한정값이 printer인 빈을 의존 주입 후보로 사용한다.

 

따라서, 위에서 애노테이션 값으로 printer을 준 MemberPrinter 타입의 memberPrinter1가 자동 주입대상으로 사용되는 것이다.

 

MemberPrinter 타입 빈을 주입받는 모든 @Autowired 애노테이션에 @Qualifier을 넣은 셈이다.

오토와이어드를 필드와 메서드에 모두 적용가능하며, 퀄리파이어 역시.

 

만약 MemberPrinter을 상속하는 MemberSummaryPrinter가 있다고 가정. 또한, AppCtx에서 memberPrinter2() 메서드가 MemberSummaryPrinter타입의 빈 객체를 설정하도록 변경후 @Qualifier 애노테이션도 삭제.

MemberListPrinter 클래스와 MemberInfoPrinter클래스의 세터 메서드에 붙인 @Qualifier 애노테이션도 삭제 후, MainForSpring을 실행 시, MemberPrinter 타입 빈을 두 개 설정하고 @Qualifier 애노테이션을 붙이지 않았을 때와 동일한 예외가 발생한다.