Spring Data JPA 原理

1. Spring Data JPA的常用接口分析

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

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

2    Spring Data JPA的實現過程
通過對客戶案例,以debug斷點調試的方式,通過分析Spring Data JPA的原來來分析程序的執行過程
我們以findOne方法爲例進行分析

 

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

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

當程序執行的時候,會通過JdkDynamicAopProxy的invoke方法,對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完整的調用過程分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章