본문 바로가기

Programing/Spring FrameWork

[Spring] 해당 타입의 빈이 여러개인 경우

728x90
반응형

[Spring] 해당 타입의 빈이 여러개인 경우


Field bookRepository in me.whiteship.demospring51.BookService required a single bean, but 2 were found:
	- myBookRepository: defined in file [/Users/youngjin/workspace/demospring51/target/classes/me/whiteship/demospring51/MyBookRepository.class]
	- youngjinBookRepository: defined in file [/Users/youngjin/workspace/demospring51/target/classes/me/whiteship/demospring51/YoungjinBookRepository.class]

Action:

Consider marking one of the beans as @Primary, 
updating the consumer to accept multiple beans, 
or using @Qualifier to identify the bean that should be consumed

 

@Autowired Annotation으로 의존성을 주입할 때,

해당 타입의 빈이 여러개인 경우 오류와 함께 해결을 위한 방법으로 3가지를 제시한다.

  1. Consider making one of the beans as @Primary
  2. updating the consumer to accept multiple beans
  3. using @Qualifier to identify the bean that should be consumed

 

@Primary Annotation 활용

@Primary Annotation을 활용하면 BookRepository를 상속받은 class들 중, 최우선으로 의존성을 부여받게 된다.

-> 최우선으로 의존성을 부여받을 Class에 @Primary Annotation을 사용한다.

package me.whiteship.demospring51;

import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;

@Repository @Primary
public class YoungjinBookRepository implements BookRepository{
}

 

@Qualifier Annotation 활용

@Qualifier Annotation을 활용하면 BookRepository를 상속받은 class들 중, 최우선으로 의존성을 부여받게 된다.

-> @Autowired Annotation으로 의존성을 주입할 경우, @Qaulifier Annotation을 활용하여 최우선으로 의존성을 부여받을 class를 지정해준다

package me.whiteship.demospring51;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service
public class BookService {

    @Autowired @Qualifier("youngjinBookRepository")
    BookRepository bookRepository;

    public void printBookRepository(){
        System.out.println(bookRepository.getClass());
    }

}

 

해당 타입의 Bean 모두 주입 받기

List<> 형태로 BookRepository를 상속하는 모든 Bean들을 주입 받을 수 있다.

package me.whiteship.demospring51;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class BookService {

    @Autowired
    List<BookRepository> bookRepositories;

    public void printBookRepository(){
        this.bookRepositories.forEach(s-> System.out.println(s.getClass()));
    }

}
728x90
반응형