Я следую руководству здесь https://www.concretepage.com/spring-boot/spring-boot-security-rest-jpa-hibernate-mysql-crud-example, чтобы создать базовый проект Spring Boot CRUD, я пытаюсь понять, что происходит с конкретным фрагментом кода.
Мое понимание интерфейсов в java заключается в том, что вы не можете вызвать сигнатуру метода интерфейса, который не является статическим и нереализованным. Но здесь в СтатьяService.java создается ссылка на интерфейс IArticleDAO, затем он использует этот тип ссылки для вызова методов из этого интерфейса IArticleDAO.java
Почему это работает? в этом интерфейсе нет реализации этих методов, поэтому я не понимаю, как он мог, во-первых, вызывать эти методы, а во-вторых, что они будут что-то делать или что-то возвращать.
Другими словами, если у вас есть переменная типа IArticleDAO, и она не равна нулю, она всегда ссылается на экземпляр класс, реализующий IArticleDAO. В этом классе реализует все необходимые методы.
Спасибо, ребята, я думаю, моя проблема заключалась в том, что я не мог видеть, где создается экземпляр, я думаю, мне нужно немного изучить, как работает @autowired




Интерфейс — это способ определения сигнатур методов. Затем объект, который реализует интерфейс, может быть назначен экземпляру этого интерфейса, и вы можете абсолютно точно вызывать их, потому что они реализованы.
Итак, если class A implements B, вы можете назначить экземпляр A переменной B: B b = new A()
Дополнительная абстракция в этом случае заключается в том, что используемое поле — это @AutoWired. Это означает, что Spring Framework найдет экземпляр объекта, который реализует интерфейс, и установит поле.
Я просто не понял, что Spring на самом деле ищет конкретный класс для применения к этой ссылке, но теперь это имеет смысл
Если у вас есть экземпляр интерфейса, вы можете вызывать все методы, объявленные в интерфейсе. Вот для чего нужны интерфейсы. Какие бы классы ни реализовывали интерфейс, они обеспечивают реализацию объявленных методов.