@Qualifier

2023. 5. 30. 15:17기술 창고/어노테이션 창고

728x90
SMALL

@Qualifier

Component 로 지정하고 ComponentScan을 통해 Bean 객체들을 생성하고 호출할 때 만약 동일한 객체들이 전부 Component 로 선언되어있다면 에러가 발생합니다.

호출할 때 반드시 단일 Component Bean 객체를 받아와야하기 때문이죠.

 

그래서 Qualifier는 호출하고자 하는 Component Bean 객체를 특정지어 고정적으로 호출할 수 있게끔 해줍니다.

 

@Component
@Qualifier("mario") // Qualifier 를 통해 특정지어 component 호출 가능. 하지만 반드시 primary 어노테이션이 존재하는 객체가 존재해야 한다.
public class MarioGame implements GamingConsole{
	~ 로직 ~
}

 

@Component
public class GameRunner {

    private GamingConsole gamingConsole;

	// 호출하는 쪽에서도 Qulifier를 명시해줌.
    public GameRunner(@Qualifier("mario") GamingConsole gamingConsole) {  
        this.gamingConsole = gamingConsole;
    }

    public void run(){
        System.out.println("게임 실행 : " + gamingConsole);
        gamingConsole.up();
        gamingConsole.down();
        gamingConsole.left();
        gamingConsole.right();
    }
}

@Component 로 Bean 객체를 지정해주고, @Qulifier("mario") 를 지정해줌으로서 특정 Bean 호출자를 생성해주었습니다.

그리고 호출하는 쪽인 GameRunner 클래스에서 생성자 부분에 @Qualifier("mario") 를 명시함으로서 해당 MarioGame 클래스를 호출합니다.

당연히 MarioGame은 GamingConsole을 구현 상속 받고 있기 때문에 GamingConsole 을 인자값으로 받아서 호출할 수 있습니다.

 

# 다만 Qualifier를 사용하려면, 여러 동일한 클래스 객체들(GamingConsole을 상속받은 클래스들)이 있는 상태에서 @Primary 어노테이션 그 클래스들 중에 한 클래스에 적용되어있어야 합니다.

 

 

728x90
반응형
LIST

'기술 창고 > 어노테이션 창고' 카테고리의 다른 글

@Lazy  (0) 2023.05.30
@Primary  (0) 2023.05.30
@ComponentScan  (0) 2023.05.30
@Component  (0) 2023.05.30
@Bean  (0) 2022.12.23