Чтобы дать немного более широкое объяснение в случае, если это полезно.
Когда ваше приложение запускается, Spring инициализирует контекст приложения;т.е. набор бобов, которые составляют ваше приложение.
Как часть этого (при наличии @EnableJpaRepositories
) Spring Data сканирует ваш путь к классу для всех интерфейсов, помеченных @Repository
.Это будет иметь место, когда ваш интерфейс репозитория расширяется JpaRepository
(или CrudRepository
или любой из его производных).
Для каждого найденного интерфейса он будет регистрировать компонент "Фабрика репозитория".Специальный тип bean-компонента, который знает, как создавать другие bean-компоненты.В этом случае он знает, как создать реализацию для вашего интерфейса репозитория.
При первом обнаружении временного кода, который автоматически связывает ваш интерфейс репозитория, это запускает фабричный компонент для создания экземпляра специального прокси-класса, который (1) реализует ваш интерфейс репозитория и (2) предназначается для экземпляра выбранногокласс реализации, обычно SimpleJpaRepository
(как объясняет @ sairamch04).Прокси-объект - это объект, который фактически подключен к вашему вызывающему коду (потому что он реализует интерфейс вашего хранилища).Поэтому, когда вы делаете вызовы к вашему интерфейсу репозитория, вы фактически вызываете прокси, и он перенаправляет вызов в реализацию.Он также может пересылать другие объекты в зависимости от того, настроили ли вы свой репозиторий или выбрали QueryDSL.Но в простом случае вызовы перенаправляются на объект реализации SimpleJpaRepository
.
HTH