Spring
스파르타 부트캠프 Spring Master 3강 같은 타입의 Bean이 2개일 경우
H.S-Backend
2024. 5. 24. 15:09
반응형
초기설정
Food Interface
public interface Food {
void eat();
}
Chicken
@Component
public class Pizza implements Food {
@Override
public void eat() {
System.out.println("피자를 먹습니다.");
}
}
Pizza
@Component
public class Pizza implements Food {
@Override
public void eat() {
System.out.println("피자를 먹습니다.");
}
}
테스트 코드
@SpringBootTest
public class BeanTest {
@Autowired
Food food;
}
위와 같은 오류가 발생한다.
해석 : Food타입의 Bean객체 하나 이상있어서 그렇다. 결국 우선순위를 정해달라
@SpringBootTest
public class BeanTest {
@Autowired
Food pizza;
@Autowired
Food chicken;
}
등록된 이름을 정확하게 명시해주면 해결할 수 있다.
@Autowired는 기본적으로
Bean Type(Food)로 DI를 지원하며
연결이 되지 않을 경우 Bean Name(pizza, chicken)으로 찾는다.
@Component
@Primary
public class Chicken implements Food {
@Override
public void eat() {
System.out.println("치킨을 먹습니다.");
}
}
@SpringBootTest
public class BeanTest {
@Autowired
Food food;
}
Chicken 클래스에 @Primary 키를 추가하여
Bean이 여러개가 있더라도
@Primary가 설정된 Bean객체를 우선 주입해준다.
@Component
@Qualifier("pizza")
public class Pizza implements Food {
@Override
public void eat() {
System.out.println("피자를 먹습니다.");
}
}
@SpringBootTest
public class BeanTest {
@Autowired
@Qualifier("pizza")
Food food;
@Test
@DisplayName("Primary 와 Qualifier 우선순위 확인")
void test1() {
// 현재 Chicken 은 Primary 가 적용된 상태
// Pizza는 Qualifier 가 추가된 상태입니다.
food.eat();
}
}
@Primary와 @Qualifier가 동시 적용되있다면
Qualifier의 우선순위가 더 높으며
반드시 @Qualifier("")를 선언해야한다.
Bean이 여러개 있을 경우
범용적으로 사용되는 Bean객체는 Primary를
지엽적 사용되는 Bean객체에는 Qualifier
반응형