// Food Interface
public interface Food {
void eat();
}
// chicken class
import org.springframework.stereotype.Component;
@Component
public class Chicken implements Food {
@Override
public void eat() {
System.out.println("치킨을 먹습니다.");
}
}
// Pizza class
import org.springframework.stereotype.Component;
@Component
public class Pizza implements Food {
@Override
public void eat() {
System.out.println("피자를 먹습니다.");
}
}
@SpringBootTest
public class BeanTest {
@Autowired
Food pizza;
@Autowired
Food chicken;
}
// chicken 클래스
@Component
@Primary
public class Chicken implements Food {
@Override
public void eat() {
System.out.println("치킨을 먹습니다.");
}
}
// BeanTest 클래스
@SpringBootTest
public class BeanTest {
@Autowired
Food food;
}
//pizza class
@Component
@Qualifier("pizza")
public class Pizza implements Food {
@Override
public void eat() {
System.out.println("피자를 먹습니다.");
}
}
// BeanTest class
@SpringBootTest
public class BeanTest {
@Autowired
@Qualifier("pizza")
Food food;
@Test
@DisplayName("Primary 와 Qualifier 우선순위 확인")
void test1() {
// 현재 Chicken 은 Primary 가 적용된 상태
// Pizza는 Qualifier 가 추가된 상태입니다.
food.eat();
}
}
같은 타입의 bean 객체들에 @Primary와 @Qualifier가 동시에 적용될 경우
- 우선순위 : Qualifer > Primary
결론 : Qualifier같은 경우는 직접적으로 주입받고자 하는 위치에 추가해야한다. 같은 타입의 bean이 여러개 있을 때 범용적으로 사용되는 bean은 @Primary로 설정해서 사용하고, 지협적으로 사용되는 bean은 qualifier를 사용하자