Объясните, пожалуйста, как организована взаимосвязь между классами в примере. Почему выполняются методы, прописанные в классе BookServiceImpl, который реализует интерфейс BookService, ведь из BooksController подключается только интерфейс, а не его реализация. Что будет, если будет несколько вариантов реализации интерфейса BookService?
@RestController
@RequestMapping(value = "/books")
public class BooksController {
@Autowired
private BookService bookService;
}
public interface BookService {
}
@Service
public class BookServiceImpl implements BookService {
}