1. 程式人生 > >spring-data-jpa原理探祕(1)-執行環境建立及載入Repository介面

spring-data-jpa原理探祕(1)-執行環境建立及載入Repository介面

spring-data-jpa的優點很多,比如繼承Repository介面,在註解中書寫JPQL語句即可訪問資料庫;支援方法名解析方式訪問資料庫;使用Predicate支援動態查詢等,在此不一一列舉了。這些都是使用spring-data-jpa中的種種優點,要想將之使用的更好更優雅,就要從spring-data-jpa的載入和執行機制進行探祕。
此文系作者檢視spring-data-jpa原始碼及參考javadoc文件成文,所以文中難免會有錯誤和紕漏,懇請讀者指出。下面進入正題。

1.執行環境建立及載入Repository介面
spring-data-jpa在執行時和springframework框架實現了無縫對接。在使用spring的@Repository註解生成Repository例項時,使用動態代理類的方式對Repository介面進行了例項化並放入spring容器中備用。
下面是spring-data-jpa中佔重要地位的RepositoryFactoryBeanSupport和RepositoryFactorySupport的類圖:




RepositoryFactoryBeanSupport的作用是,為spring的FactoryBean介面開發的介面卡,可以很便捷的通過spring配置設定repository工廠;而RepositoryFactorySupport的作用是,建立一個給定repository介面例項的工廠bean。建立一個實現配置的repository介面的代理,並應用一個advice將控制交給QueryExecuterMethodInterceptor。

通過檢視原始碼,我們可以看到在RepositoryFactoryBeanSupport中持有一個私有RepositoryFactorySupport類變數,在執行RepositoryFactoryBeanSupport.afterPropertiesSet()方法時,通過createRepositoryFactory()方法,new了一個JpaRepositoryFactory例項並賦值給了類變數factory(RepositoryFactorySupport),檢視JpaRepositoryFactory的構造器,可以看到持有了entityManager等例項,以方便後面的使用。

RepositoryFactoryBeanSupport中的private T initAndReturn()是另一個相當重要的方法,方法說明是:
Returns the previously initialized repository proxy or creates and returns the proxy if previously uninitialized.返回先前例項化了的repository代理例項,或者,如果先前沒有例項化,那麼生成並且返回一個代理例項。

為什麼這麼說明呢?我們來看程式碼,這個方法被另外兩個方法呼叫,一個是afterPropertiesSet(),這是實現InitialingBean介面需要實現的一個載入方法,一般會先呼叫;另一個則是實現FactoryBean介面需要實現的getObject()方法,在執行中會呼叫之返回一個Repository介面的例項。所以,一般來說initAndReturn()至少會有兩次被呼叫的機會。initAndReturn()的實現比較簡單:

private T initAndReturn() {
	Assert.notNull(repositoryInterface, "Repository interface must not be null on initialization!");

	if (this.repository == null) {
		this.repository = this.factory.getRepository(repositoryInterface, customImplementation);
	}

	return this.repository;
}
通過RepositoryFactorySupport(JpaRepositoryFactory例項)的getRepository(repositoryInterface, customImplementation);獲取了一個org.springframework.data.jpa.repository.support.SimpleJpaRepository代理類例項(定義為泛型T extends Repository),在構造這個例項時,進行了一系列的執行環境準備:
在RepositoryFactorySupport的內部類QueryExecutorMethodInterceptor中獲取Query查詢策略類QueryLookupStrategy例項(此處一般是CreateIfNotFoundQueryLookupStrategy例項),然後執行resolveQuery(method, repositoryInformation, factory, namedQueries);方法將RepositoryQuery例項執行迴圈放入RepositoryFactorySupport(JpaRepositoryFactory例項)的類變數queries,一個ConcurrentHashMap<Method, RepositoryQuery>中。
下圖是QueryLookupStrategy的類圖:


構造RepositoryQuery例項時對應了一個JpaQueryMethod例項,RepositoryQuery例項實際上是SimpleJpaQuery例項。

上面的描述總括上來說,就是一個通過spring框架生成(注意不是注入生成)的JpaRepositoryFactoryBean例項實現了InitialzingBean介面,在public void afterPropertiesSet()方法呼叫時生成了一個SimpleJpaRepository代理例項。SimpleJpaRepository例項中持有本次例項化的Repository代理類,以及在QueryExecutorMethodInterceptor構造器中例項化了的多個JpaQueryMethod,顧名思義,JpaQueryMethod就是jpa的帶有@Query註解的方法資料儲存類,所以Repository介面有多少個方法,就會包含多少個JpaQueryMethod例項被加入監聽序列。

相關推薦

spring-data-jpa原理探祕1-執行環境建立載入Repository介面

spring-data-jpa的優點很多,比如繼承Repository介面,在註解中書寫JPQL語句即可訪問資料庫;支援方法名解析方式訪問資料庫;使用Predicate支援動態查詢等,在此不一一列舉了。這些都是使用spring-data-jpa中的種種優點,要想將之使用的更

spring-data-jpa原理探祕3-QueryMethod類

第三篇,我們來說說JPA規範中的QueryMethod相關類。首先給出類圖和繼承關係: 很簡單,是不是,只有區區兩個相關類,QueryMethod及其子類JpaQueryMethod。 QueryMethod類位於spring-data-commons-***.jar包中;

spring-data-jpa原理探祕2-RepositoryQuery的用途和分類

本系列的第二篇文章,主要講解在spring-data-jpa中佔有重要地位的RepositoryQuery介面的用途和分類。 首先我們看看RepositoryQuery介面極其子類的類圖 上圖很清晰的說明,RepositoryQuery介面包含SimpleJpaQuery,

spring-data-jpa原理探祕4-JpaQueryExecution類概述

spring-data-jpa原理的第四篇,來說說JpaQueryExecution相關類。首先給出類圖和繼承關係: spring-data-jpa中對JpaQueryExecution有明確說明: 包含多個查詢執行策略的類的集合。根據大多數org.springframew

spring-data-jpa快速入門——

快速 span ron blank support bubuko body lan -s 一、概述   官網:https://projects.spring.io/spring-data-jpa/   1.什麽是spring-data-jpa   Spring D

spring-data-jpa快速入門——簡單查詢

ref spa data mail domain event cif open 寫實 一、方法名解析   1.引言     回顧HelloWorld項目中的dao接口 public interface GirlRepository extends JpaRepos

spring-data-jpa簡單使用

1:使用spring-data-jpa很簡單,只需要在dao層繼承repository介面即可。那麼repository介面是什麼呢?  可以看到repository介面下面什麼都沒有,這表明它是一個標記介面。標記介面的作用的什麼?標記介面的作用是把當前類納入到spring的容器

spring-data-jpa簡單使用

1:可以使用原生態的sql語句查詢資料庫 @Query(value = "select meetings.* FROM tenant\n" + "LEFT JOIN meeting_domain_binding ON tenant.id = meeting_dom

Spring Data Jpa系列教程--------入門

大渣好,我是小小書生,現在開始,我們來學習船新的一門技術,SpringDataJpa,它是一個。。額。。(我百度一下) JPA(Java Persistence API)是Sun官方提出的Java持久化規範。它為Java開發人員提供了一種物件/關聯對映工具來管理Java

Stuts2學習筆記1環境搭建Demo

原始碼: github: https://github.com/liaotuo/Struts2-Demo/tree/master/struts2-demo 環境搭建 下載struts2 官網下載:http://mirror.bit.edu.cn/apache/struts

區塊鏈1開發環境搭建Hello World合約展示

開發環境搭建 如果你對於以太坊智慧合約開發還沒有概念,請先閱讀以太坊智慧合約入門,本文基於windows平臺開發。 Geth 安裝 以太坊的客戶端有很多,我們選擇開發過程中最為流行的Geth,其基於Go語言開發。 到官方地址下載相應的安

J2EE專案系列--Spring Data JPA+Spring+SpringMVC+Maven快速開發1專案架構

好久沒給大家弄Java後端專案系列了,因為接了Java後端外包以及學習一些後端優化的東西。而現在開始慢慢在這個系列的(三)逐漸把後端外包的一些有價值的東西分享給大家,並且自己也總結一遍嘛。 文章結構:(1)專案環境搭建;(2)簡單業務邏輯測試框架;(3

Spring Data JPA動態查詢多條件and

ica cat 滿足 from pos true ans let tid entity: @Entity @Table(name = "data_illustration") public class Test { @Id @Gen

spring data jpa關聯查詢一對一、一對多、多對多

sse eager save net array ota println ack generate   在實際過往的項目中,常用的查詢操作有:1、單表查詢,2、一對一查詢(主表和詳情表)3、一對多查詢(一張主表,多張子表)4、多對多查詢(如權限控制,用戶、角色多對多)。做個

一、Spring-Data-Jpa 初體驗基於SpringBoot

閒話少說,首先動起來(基於springboot+gradle): 1、引入依賴 dependencies { compile 'org.springframework.boot:spring-boot-starter-data-jpa:2.1.1.RELEASE' testCompile

Spring原理解析1- 框架概述

Spring概述 1. 什麼是spring? Spring 是個java企業級應用的開源開發框架。Spring主要用來開發Java應用,但是有些擴充套件是針對構建J2EE平臺的web應用。Spring 框架目標是簡化Java企業級應用開發,並通過POJO為基礎的

Spring源代碼分析1---LocalSessionFactoryBean(工廠的工廠)

self action interface 開始 environ mac hbm upd put LocalSessionFacotoryBean其實就是適配了Configuration對象,或者說是一個工廠的工廠,他是Configuration的工廠,生成了Configu

Spring Data Redis整體介紹

目前 擴展 刪除 依據 實例化 -m doc 不同的 SDR 為什麽使用Spring Data Redis 首先Spring Data Redis 是Spring 框架提供的用於操作Redis的客戶端。 Spring框架是一個全棧Java程序框架,通過DI、AOP和便攜的服

Spring Data JPA中文文檔[1.4.3] PDF

repos itl class rda pdf spring ims com main 下載地址:網盤下載 1.使用 Spring Data Repositories Spring Data Repository的存在,是為了把你從大量重復、繁雜的數據庫層操作中解放出來。

HashMap的底層原理實現1

TP CQ 鍵值對 jpeg 需要 dns cnp 第一步 進行 ———————————— 眾所周知,HashMap是一個用於存儲Key-Value鍵值對的集合,每一個鍵值對也叫做Entry。這些個鍵值對(Entry)分散存儲