@Service
public class BookService {
BookRepository bookRepository;
@Autowired
public BookService(BookRepository bookRepository) {
this.bookRepository = bookRepository
}
}
- BookRepository가 빈으로 등록되어 있지 않으면 에러이다. (스프링컨테이너가 Autowire할 빈을 찾지 못하기 때문에)
- BookRepository에 @Repository 또는 @Configuration을 사용하여 빈으로 등록해야지 에러가 안난다.
@Repository public class BookRepository { }
- @Autowired(required = false) 처럼, Autowired 설정을 false로 설정 가능. (Optional함 빈이 있으면 엮어주고 없으면 엮지않는다.)
@Service
public class BookService {
BookRepository bookRepository;
@Autowired(required = false)
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
- setter 설정시에는 BooKRepository를 빈으로 등록하지않아도, @Autowired(required = false)로 설정을하면 에러가 나지 않는다.
- @Autowired의 required는 기본값이 true이므로, setter로 주입할때 bean등록이 되어있지 않을 때 false로 설정을 안할 경우 주입을 할 수 없기 때문에 에플리케이션 구동에 실패한다.
해당 타입의 빈이 없는 경우 (위 코드에 설명)
해당 타입의 빈이 한 개인 경우 (OK)
해당 타입의 빈이 여러 개인 경우
같은 이름의 빈 찾으면 해당 빈 사용
같은 이름 못 찾으면 실패
public interface BookRepository {}
@Repository
public class HyunkiBookRepository implements BookRepository{}
@Repository
public class MyBookRepository implements BookRepository{}
같은 타입의 빈이 여러개 일 때 아래의 방법 사용하여 주입 가능하다.
@Repository @Primary
public class HyunkiBookRepository implements BookRepository{}
@Repository
public class BookService{
@Autowired
List<BookRepository> bookRepository;
}
@Repository
public class BookService{
@Autowired @Qualifier("hyunkiBookRepository")
BookRepository bookRepository;
}
동작원리