<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    stone2083

    Spring Data JPA 代碼分析

    背景
    接上文:Spring Data JPA 簡單介紹
    本文將從配置解析,Bean的創建,Repository執行三個方面來簡單介紹下Spring Data JPA的代碼實現

    友情提醒:
    圖片均可放大

    配置解析
    1. parser類
    Spring通過Schema的方式進行配置,通過AbstractRepositoryConfigDefinitionParser進行解析。其中包含對NamedQuery的解析。
    解析的主要目的,是將配置文件中的repositories和repository元素信息分別解析成GlobalRepositoryConfigInformation和SingleRepositoryConfigInformation。
    詳見下圖
    2. Information

    CommonRepositoryConfigInformation:
    xml中repositories的通用配置,一般對應其中的attributes
    SingleRepositoryConfigInformation:
    xml中repository的配置信息,對應其中的attributes
    GlobalRepositoryCOnfigInformation:
    一組SingleRepositoryConfigInfomation信息,包含所有的Single信息
    在JPA實現中,針對Single,有兩份實現,一份是自動配置信息,一份是手動配置信息,分別對應圖中的Automatic和Manual。
    SimpleJpaRepositoryConfiguration是JPA中的所有配置信息,包含所有的Jpa中的SingleRepositoryConfigInformation。
    3. Query Lookup Strategy
    CreateQueryLookupStrategy:對應repositories元素
    query-lookup-strategy的create值,主要針對method query方式
    DeclaredQueryLookupStrategy:對應use-declared-query值,主要針對帶有@Query注解的查詢方式
    CreateIfNotFoundQueryLookupStrategy:對應create-if-not-found值(default值),結合了上述兩種方式


    Bean的創建

    主要包含兩個類
    RepositoryFactoryBeanSupport, Spring Factory Bean,用于創建Reposiory代理類。其本身并不真正做代理的事情,只是接受Spring的配置,具體交由RepositoryFactorySupport進行代理工作
    RepositoryFactorySupport, 真正做Repository代理工作,根據JpaRepositoryFactoryBean的定義找到TargetClass:SimpleJpaRepository實現類,中間加入3個攔截器,一個是異常翻譯,一個是事務管理,最后一個是QueryExecutorMethodInterceptor。
    QueryExecutorMethodInterceptor是個重點,主要做特定的Query(查詢語句)的操作。

    Repository執行
    1. 主要執行類
    在看上面Bean定義的時候,其實已經明白了執行過程:
    1. 將JPA CRUD規范相關的方法交給SimpleJpaRepository這個類執行
    2. 將特殊查詢相關的交給QueryExecutorMethodInterceptor執行。主要做自定義實現的部分,method query部分和named query部分。
    具體查詢類詳見下圖。

    2. 查詢相關
    主要支持NamedQuery和JPA Query。


    主要執行代碼
    QueryExecutorMethodInterceptor#invoke(MethodInvocation invocation)
     1 public Object invoke(MethodInvocation invocation) throws Throwable {
     2 
     3             Method method = invocation.getMethod();
     4 
     5             if (isCustomMethodInvocation(invocation)) {
     6                 Method actualMethod = repositoryInformation.getTargetClassMethod(method);
     7                 makeAccessible(actualMethod);
     8                 return executeMethodOn(customImplementation, actualMethod,
     9                         invocation.getArguments());
    10             }
    11 
    12             if (hasQueryFor(method)) {
    13                 return queries.get(method).execute(invocation.getArguments());
    14             }
    15 
    16             // Lookup actual method as it might be redeclared in the interface
    17             // and we have to use the repository instance nevertheless
    18             Method actualMethod = repositoryInformation.getTargetClassMethod(method);
    19             return executeMethodOn(target, actualMethod,
    20                     invocation.getArguments());
    21         }

    主要分3個步驟:
    1. 如果配置文件中執行了接口類的實現類,則直接交給實現類處理
    2. 判斷是查詢方法的,交給RepositoryQuery實現,具體又分:NamedQuery,SimpleJpaQuery,PartTreeJpaQuery
    3. 不屬于上述兩個,則直接將其交給真正的targetClass執行,在JPA中,就交給SimpleJpaRepository執行。

    本文并沒有做詳細的分析,只是將核心的組件類一一點到,方便大家自行深入了解代碼。

    posted on 2011-08-25 16:28 stone2083 閱讀(5134) 評論(1)  編輯  收藏 所屬分類: java

    Feedback

    # re: Spring Data JPA 代碼分析 2015-07-02 17:40 zuidaima

    springdata demo教程源代碼下載 :http://zuidaima.com/share/kspringdata-p1-s1.htm  回復  更多評論   

    主站蜘蛛池模板: 亚洲国产香蕉人人爽成AV片久久| 成人免费毛片观看| 国产成人精品免费视| 在线观看无码AV网站永久免费| 午夜免费福利在线观看| 亚洲国产一成久久精品国产成人综合| 国产av无码专区亚洲av果冻传媒| 久久亚洲国产伦理| 亚洲免费观看在线视频| 亚洲欧美在线x视频| av永久免费网站在线观看| 四虎在线成人免费网站| 国产精品视_精品国产免费| 亚洲人色婷婷成人网站在线观看| 久久亚洲精品无码aⅴ大香| 亚洲av乱码中文一区二区三区| 久久99精品免费一区二区| 亚洲第一网站免费视频| 国产成人精品免费视频软件| 亚洲尤码不卡AV麻豆| 亚洲成电影在线观看青青| 老湿机一区午夜精品免费福利 | 亚洲天堂久久精品| 亚洲国产美女精品久久久| 青青操在线免费观看| 美女网站免费福利视频| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 日本激情猛烈在线看免费观看| 久久国产色AV免费看| 免费精品国产自产拍观看| 亚洲va在线va天堂va不卡下载 | 亚洲日本在线播放| 青青草国产免费国产是公开| 最近免费视频中文字幕大全| 国产免费小视频在线观看| 亚洲国产精品久久| 黄色毛片免费在线观看| 91在线老王精品免费播放| 亚洲国产成人久久综合一区77| 亚洲欧洲国产精品久久| 一出一进一爽一粗一大视频免费的|