第3章Spring Data JPA的內部原理剖析


Spring Data JPA的常用接口分析

在客戶的案例中,我們發現在自定義的CustomerDao中,並沒有提供任何方法就可以使用其中的很多方法,那么這些方法究竟是怎么來的呢?答案很簡單,對於我們自定義的Dao接口,由於繼承了JpaRepositoryJpaSpecificationExecutor,所以我們可以使用這兩個接口的所有方法。

 

 

在使用Spring Data JPA時,一般實現JpaRepositoryJpaSpecificationExecutor接口,這樣就可以使用這些接口中定義的方法,但是這些方法都只是一些聲明,沒有具體的實現方式,那么在 Spring Data JPA中它又是怎么實現的呢?

2 Spring Data JPA的實現過程

通過對客戶案例,以debug斷點調試的方式,通過分析Spring Data JPA的原來來分析程序的執行過程

 

我們以findOne方法為例進行分析

 

 

 

代理子類的實現過程

 

 

斷點執行到方法上時,我們可以發現注入的customerDao對象,本質上是通過JdkDynamicAopProxy生成的一個代理對象

 

 代理對象中方法調用的分析

 

 

 

當程序執行的時候,會通過JdkDynamicAopProxyinvoke方法,對customerDao對象生成動態代理對象。根據對Spring Data JPA介紹而知,要想進行findOne查詢方法,最終還是會出現JPA規范的API完成操作,那么這些底層代碼存在於何處呢?答案很簡單,都隱藏在通過JdkDynamicAopProxy生成的動態代理對象當中,而這個動態代理對象就是SimpleJpaRepository

 

 

通過SimpleJpaRepository的源碼分析,定位到了findOne方法,在此方法中,返回em.find()的返回結果,那么em又是什么呢?

 

 

帶着問題繼續查找em對象,我們發現em就是EntityManager對象,而他是JPA原生的實現方式,所以我們得到結論Spring Data JPA只是對標准JPA操作進行了進一步封裝,簡化了Dao層代碼的開發

Spring Data JPA完整的調用過程分析

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM