6. Qualifier

홍준성·2022년 7월 21일
0

Qualifier

@Autowired를 통해 객체를 주입할 때 같은 타입의 객체가 여러 개 있다면, 구분할 수 없다.
이 때, @Qualifier를 통해 식별자를 부여하면 원하는 객체를 주입받을 수 딨다.

@Primary를 사용하게 되면 default값으로 설정할 수 있으며, 식별자 없이 주입 시 @Primary가 사용된 객체가 주입된다.

[1]

	@Qualifier("식별자A") @Primary
	public class 클래스A implements 인터페이스{
    
    }
    
    @Qualifier("식별자B")
	public class 클래스A implements 인터페이스{
    
    }
    
[2]
	@Autowired
    @Qualifier("식별자B")
    private 인터페이스 객체;
[1] Desktop
package com.example.ex00.dependency.qualifier;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
@Qualifier("desktop")
public class Desktop implements Computer {

	@Override
	public int getScreenWidth() {
		return 1920;
	}

}


[2] Laptop
package com.example.ex00.dependency.qualifier;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
@Qualifier("laptop")
public class Laptop implements Computer {

	@Override
	public int getScreenWidth() {
		return 1280;
	}

}


[3] Desktop 불러오기
package com.example.ex00.dependency.qualifier;

import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class QualifierTests {
	@Autowired
	@Qualifier("desktop")
	private Computer desktop;
	
	@Test
	public void testQualifier() {
		log.info("==============");
		log.info("computer: " + desktop);
		log.info("==============");
	}
}

[실습]
dependency package
1. Restaurant 클래스 선언
2. Chef 클래스 선언
3. 의존 관계 확립 후 생성자 주입 진행
4. 단위 테스트를 통해 객체 확인

qualifier package
1. Restaurant 인터페이스 선언
2. steak 가격 80000원 선언, saladbar 유무 여부 선언
3. Outback 클래스 선언, Restaurant 지정
4. Vips 클래스 선언, Restaurant 지정
5. 기본 주입 대상은 Vips로 설정
6. 단위 테스트를 통해 객체 확인


  1. Restaurant 클래스 선언
package com.example.ex00.dependency;

import org.springframework.stereotype.Component;

import lombok.Data;
import lombok.RequiredArgsConstructor;

@Component
@Data
@RequiredArgsConstructor
public class Restaurant {
	private final Chef chef;
}
  1. Chef 클래스 선언
package com.example.ex00.dependency;

import org.springframework.stereotype.Component;

import lombok.Data;
import lombok.RequiredArgsConstructor;

@Component
@Data
@RequiredArgsConstructor
public class Chef {;}
  1. 단위 테스트를 통해 객체 확인
package com.example.ex00.dependency;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class DependencyTests {

	@Autowired
	@Qualifier("outback")
	private Restaurant outback;
	
	@Autowired
	@Qualifier("vips")
	private Restaurant vips;
	
	@Autowired
	private Restaurant restaurant;
	

	
	@Test
	public void checkDependencyInjection() {
		log.info("-------------");
		log.info("restaurant: " + restaurant);
		log.info("chef: " + restaurant.getChef());
		log.info("-------------");
	}
}

qualifier package
1. Restaurant 인터페이스 선언
2. steak 가격 80000원 선언, saladbar 유무 여부 선언

package com.example.ex00.dependency.qualifier;

public interface Restaurant {
	public int steak = 80000;
	public boolean hasSalad();
}
  1. Outback 클래스 선언, Restaurant 지정
package com.example.ex00.dependency.qualifier;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
@Qualifier("outback")
public class Outback implements Restaurant {

	@Override
	public boolean hasSalad() {
		// TODO Auto-generated method stub
		return false;
	}

}
  1. Vips 클래스 선언, Restaurant 지정
  2. 기본 주입 대상은 Vips로 설정
package com.example.ex00.dependency.qualifier;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;

@Component
@Qualifier("vips") @Primary
public class Vips implements Restaurant {

	@Override
	public boolean hasSalad() {
		// TODO Auto-generated method stub
		return true;
	}

}
  1. 단위 테스트를 통해 객체 확인
package com.example.ex00.dependency.qualifier;


import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


import com.example.ex00.dependency.qualifier.Restaurant;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class QualifierTests {
	@Autowired
	@Qualifier("outback")
	private Restaurant outback;
	
	@Autowired
	@Qualifier("vips")
	private Restaurant vips;
	
	@Autowired
	private Restaurant restaurant;
	
	@Test
	public void testQualifier() {
		log.info("==============");
		log.info("outback: " + outback);
		log.info("outback salad: " + outback.hasSalad());
		log.info("steak price: " + Outback.steak);
		log.info("==============");
		
		log.info("==============");
		log.info("vips: " + vips);
		log.info("vips salad: " + vips.hasSalad());
		log.info("steak price: " + Vips.steak);
		log.info("==============");

		
		log.info("==============");
		log.info("vips: " + restaurant);
		log.info("vips salad: " + restaurant.hasSalad());
		log.info("steak price: " + Restaurant.steak);
		log.info("==============");
		
	}
}
profile
준성이의 개발자 공부 velog

0개의 댓글