같은 타입의 Bean

김나영·2023년 6월 27일
0

Spring

목록 보기
14/38

같은 타입의 Bean 등록

@SpringBootTest
public class BeanTest {
    @Autowired
    Food food;    
}
  • @Autowired : Bean 타입으로 DI를 지원, Food 타입으로 Bean을 찾음 --> 오류 발생 --> Bean의 이름으로 찾음

    • 오류 발생 : 같은 필드(food 필드)에 Bean을 주입해야하는데 같은 타입의 Bean 객체가 하나 이상이기 때문에 어떤 Bean을 등록해줘야할지 몰라 오류가 발생

어떻게 해결하지?

@SpringBootTest
public class BeanTest {
    @Autowired
    Food pizza; 
    @Autowired
    Food chicken;
}
  • 등록된 Bean 이름을 명시해줌

  • 즉, @Autowired가 기본적으로는 Bean Type(Food)으로 DI를 지원하며 연결이 되지않을 경우 Bean Name(pizza, chicken)으로 찾는 것을 확인


@Primary

@Component
@Primary
public class Chicken implements Food {
    @Override
    public void eat() {
        System.out.println("치킨을 먹습니다.");
    }
}
  • @Primary가 추가되면 같은 타입의 Bean이 여러 개 있더라도 우선 @Primary가 설정된 Bean 객체를 주입해줌

@Qualifier

  • 적용하려면 주입 받고자하는 곳에 해당 Qualifier를 반드시 추가해야함!!
@Component
@Qualifier("pizza")
public class Pizza implements Food {
    @Override
    public void eat() {
        System.out.println("피자를 먹습니다.");
    }
}
  • 주입하고자하는 필드에도 @Qualifier("pizza")를 추가 --> 해당 Bean 객체 주입됨

누가 우선 순위가 더 높을까?

  • 같은 타입의 Bean들에 Qualifier와 Primary가 동시에 적용되어 있다면 Qualifier의 우선순위가 더 높음 (Qualifier > Primary)

  • 같은 타입의 Bean이 여러 개 있을 때는 범용적으로 사용되는 Bean 객체에는 Primary 사용

  • 지엽적으로 사용되는 Bean 객체에는 Qualifier를 사용

  • 즉, 좁은 범위의 설정이 우선 순위가 높음

0개의 댓글