Как Spring выбирает реализацию интерфейса во время выполнения - PullRequest
0 голосов
/ 02 февраля 2019

Интересно, как среда JPA данных пружины подбирает реализацию для JpaRepository.

enter image description here

Как вы можете видеть на изображении выше,Есть два класса, которые реализуют JpaRepository.Просто возьмем пример.

Я не видел нигде в онлайн-демонстрационных примерах, указывающих, что используют этот конкретный класс таким образом, что.

Ответы [ 3 ]

0 голосов
/ 02 февраля 2019

То, что сказал @ sairamch04, в порядке.Могу только добавить, что когда запрос определен с помощью аннотации @Query или с использованием стандартного имени метода jpa, для выполнения запроса создается прокси-объект.Создание этих прокси находится в фабричных объектах, таких как JpaRepositoryFactory.В противном случае он возвращается к реализации, такой как SimpleJpaRepository.Для получения дополнительной информации о хранилище вы можете вызвать метод RepositoryFactorySupport.getReporitory() в spring-data-commons.

0 голосов
/ 02 февраля 2019

Чтобы дать немного более широкое объяснение в случае, если это полезно.

Когда ваше приложение запускается, Spring инициализирует контекст приложения;т.е. набор бобов, которые составляют ваше приложение.

Как часть этого (при наличии @EnableJpaRepositories) Spring Data сканирует ваш путь к классу для всех интерфейсов, помеченных @Repository.Это будет иметь место, когда ваш интерфейс репозитория расширяется JpaRepository (или CrudRepository или любой из его производных).

Для каждого найденного интерфейса он будет регистрировать компонент "Фабрика репозитория".Специальный тип bean-компонента, который знает, как создавать другие bean-компоненты.В этом случае он знает, как создать реализацию для вашего интерфейса репозитория.

При первом обнаружении временного кода, который автоматически связывает ваш интерфейс репозитория, это запускает фабричный компонент для создания экземпляра специального прокси-класса, который (1) реализует ваш интерфейс репозитория и (2) предназначается для экземпляра выбранногокласс реализации, обычно SimpleJpaRepository (как объясняет @ sairamch04).Прокси-объект - это объект, который фактически подключен к вашему вызывающему коду (потому что он реализует интерфейс вашего хранилища).Поэтому, когда вы делаете вызовы к вашему интерфейсу репозитория, вы фактически вызываете прокси, и он перенаправляет вызов в реализацию.Он также может пересылать другие объекты в зависимости от того, настроили ли вы свой репозиторий или выбрали QueryDSL.Но в простом случае вызовы перенаправляются на объект реализации SimpleJpaRepository.

HTH

0 голосов
/ 02 февраля 2019

Spring data использует JpaRepositoryFactory по умолчанию, чтобы найти правильную реализацию для вашего хранилища.Вы можете определить пользовательскую фабрику с помощью конфигурации @EnableJpaRepositories(repositoryFactoryBeanClass = CustomRepositoryFactoryBean.class)

Вот как JpaRepositoryFactory выбирает реализацию

@Override
protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {

    if (isQueryDslExecutor(metadata.getRepositoryInterface())) {
        return QuerydslJpaRepository.class;
    } else {
        return SimpleJpaRepository.class;
    }
}

Из исходного кода isQueryDslExecutor, если ваш репозиторий реализует QuerydslPredicateExecutor, затем используется QuerydslJpaRepository реализация.

private boolean isQueryDslExecutor(Class<?> repositoryInterface) {

    return QUERY_DSL_PRESENT && QuerydslPredicateExecutor.class.isAssignableFrom(repositoryInterface);
}
...