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

반응형