Food 클래스
public interface Food {
void eat();
}
Chicken 클래스
@Component
public class Chicken implements Food {
@Override
public void eat() {
System.out.println("치킨을 먹습니다.");
}
}
Pizza 클래스
@Component
public class Pizza implements Food {
@Override
public void eat() {
System.out.println("피자를 먹습니다.");
}
}
BeanTest 클래스
public class BeanTest {
@Autowired
Food food; // 에러
}
BeanTest 클래스
@SpringBootTest
public class BeanTest {
@Autowired
Food pizza; // Bean 이름 : pizza
@Autowired
Food chicken; // Bean 이름 : chicken
}
Chicken 클래스
@Component
@Primary
public class Chicken implements Food {
@Override
public void eat() {
System.out.println("치킨을 먹습니다.");
}
}
BeanTest 클래스
@SpringBootTest
public class BeanTest {
@Autowired
Food food;
}
@Primary 사용 상황
같은 타입의 Bean이 여러 개 있을 때,
범용적으로 사용되는 Bean 객체에는 @Primary를 설정
Pizza 클래스
@Component
@Qualifier("pizza")
public class Pizza implements Food {
@Override
public void eat() {
System.out.println("피자를 먹습니다.");
}
}
BeanTest 클래스
@SpringBootTest
public class BeanTest {
@Autowired
@Qualifier("pizza") // pizza 객체를 여기에 주입 -> 주입하고자하는 필드에도 @Qualifier("pizza") 를 추가
Food food;
}
@Qualifier 사용 상황
Qualifier 를 적용하기 위해서는 주입받을 곳에 일일이 @Qualifier를 반드시 추가해야한다.
지엽적으로 사용되는 Bean 객체에는 @Qualifier를 설정
Chicken 클래스
@Component
@Primary
public class Chicken implements Food {
@Override
public void eat() {
System.out.println("치킨을 먹습니다.");
}
}
Pizza 클래스
@Component
@Qualifier("pizza")
public class Pizza implements Food {
@Override
public void eat() {
System.out.println("피자를 먹습니다.");
}
}
BeanTest 클래스
@SpringBootTest
public class BeanTest {
@Autowired
@Qualifier("pizza")
Food food;
@Test
@DisplayName("Primary 와 Qualifier 우선순위 확인")
void test1() {
// 현재 Chicken 은 Primary 가 적용된 상태
// Pizza는 Qualifier 가 추가된 상태입니다.
food.eat();
}
}
현재 상황 : 같은 타입의 Bean들에 Qualifier와 Primary가 동시에 적용된 상황
이땐, Qualifier의 우선순위가 더 높다. (Qualifier 의 결과값이 반환됨)