JpaRepositoryBean創(chuàng)建流程分析

前言

在使用spring-data-jpa對于dao層或者叫做數(shù)據(jù)倉庫層,我們只需要定一個(gè)簡單的repository接口融击,就能完成一些基本的curd操作筑公。但本質(zhì)上spring幫我們做了很多事情。

學(xué)習(xí)spring-data-jpa原理的收益

  • 有助于我們理解spring-data-jpa尊浪,使用起來更加得心應(yīng)手匣屡。
  • 學(xué)習(xí)spring的設(shè)計(jì)模式涩拙,有助于日志業(yè)務(wù)中間件的開發(fā)。

EnableJpaRepositories

這是一個(gè)開啟Srping JPA的代碼配置的注解耸采。這個(gè)套路在spring里面已經(jīng)司空見慣兴泥。

常用屬性

  • basePackages/basePackageClasses 指定掃描repository 的包路徑
  • repositoryBaseClass 指定repository的基類,默認(rèn)是SimpleJpaRepository哦虾宇。

registerBeanDefinitions

打開注解 @EnableJpaRepositories的源碼發(fā)現(xiàn)搓彻,它的核心是導(dǎo)入了一個(gè)JpaRepositoriesRegistrar(jpa倉庫登記員)的類。

image-20210501105500655

可以看出這個(gè)登記員的核心方法是registerBeanDefinitions嘱朽,我們在該方法里面設(shè)置一個(gè)斷點(diǎn)旭贬。看下方法的調(diào)用棧信息搪泳。

image-20210501111636395
  1. 發(fā)生在refreshContext階段
  2. 使用的是ConfigurationClassPostProcessor進(jìn)行處理的稀轨。
  3. 通過@Configuration注解加載BeanDefinition
  4. 通過登記員加載BeanDefinition
  5. 名叫Jpa Repository的登記員登記BeanDefinition 當(dāng)然實(shí)際的邏輯是它的支撐類在執(zhí)行。

找到了口子之后岸军,我們再來詳細(xì)地分析下registerBeanDefinitions的源代碼奋刽。由于貼圖比較占篇幅,這段過程就以文字描述為主了艰赞。請讀者對照下spring源碼佣谐。

  1. 首先有個(gè)最基礎(chǔ)的判斷,只有使用EnableJpaRepositories注解方妖,才會(huì)執(zhí)行注冊數(shù)據(jù)倉庫的邏輯狭魂。

    image-20210501110028417

  2. 接著構(gòu)建一個(gè)數(shù)據(jù)倉庫配置代表RepositoryConfigurationDelegate 構(gòu)建過程的關(guān)鍵信息就是填充了一個(gè)默認(rèn)數(shù)據(jù)倉庫配置類DefaultRepositoryConfiguration,這個(gè)是類是每個(gè)repository一個(gè)党觅,找repository的方式很粗暴雌澄,

    image-20210501144755194
  3. 然后代表執(zhí)行registerRepositoriesInBeanDefinition注冊到注冊中心。

delegate.registerRepositoriesIn(registry, extension);
  1. 方法內(nèi)部杯瞻,使用RepositoryBeanDefinitionBuilder 依據(jù)DefaultRepositoryConfiguration創(chuàng)建镐牺,注意此時(shí)創(chuàng)建的BeanDefinition的beanClass是org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean
  2. 到此完成了repository的BeanDefinition的注冊。那啥時(shí)候創(chuàng)建repository的呢又兵。答案就藏在JpaRepositoryFactoryBeanafterPropertiesSet方法里任柜。同樣afterPropertiesSet邏輯也是由支撐類RepositoryFactoryBeanSupport (和JpaRepositoryFactoryBean是父子關(guān)系)實(shí)現(xiàn)的卒废。

Create Repository

我們將斷點(diǎn)設(shè)置在這個(gè)方法里沛厨,來看下它的調(diào)用棧。
image-20210501180221357
  1. 仍然發(fā)生在刷新ApplicationContext
  2. 初始化所有非懶加載的單例的Bean
  3. 實(shí)際交給Bean工廠執(zhí)行初始化單例模式的bean
  4. 初始化bean摔认,調(diào)用幾個(gè)和bean初始化相關(guān)的有感知的方法 逆皮,調(diào)用初始化方法(afterPropertiesSetinitMehod
  5. 調(diào)用afterPropertiesSet

RepositoryFactoryBeanSupport#afterPropertiesSet首先創(chuàng)建了一個(gè)數(shù)據(jù)倉庫工廠(JpaRepositoryFactory)。然后調(diào)用工廠的getRepository方法参袱,實(shí)際邏輯還是他的父類RepositoryFactorySupport中电谣。最核心的是使用了spring aop的動(dòng)態(tài)代理生成了repository實(shí)例秽梅。注意JpaRepositoryFactorygetRepositoryBaseClass方法硬編碼為SimpleJpaRepository,這個(gè)類實(shí)現(xiàn)了常見的CURD操作。

小結(jié)

整個(gè)過程下來剿牺。給我感受最深的就是spring代碼非常條理清楚企垦,有條不穩(wěn),層次分明 讀好的源碼就好像是在讀一篇有理有據(jù)的議論文晒来。這對我們在寫業(yè)務(wù)代碼是很有幫助的钞诡。由于本篇關(guān)注的是整個(gè)repository bean的創(chuàng)建過程,所以其中很多地方都是一帶而過湃崩。比如spring aop的動(dòng)態(tài)代理禽绪,factory bean项钮, bean的初始化,都可以詳細(xì)展開。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恰力,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子听怕,更是在濱河造成了極大的恐慌迫卢,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邓梅,死亡現(xiàn)場離奇詭異随夸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)震放,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門宾毒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人殿遂,你說我怎么就攤上這事诈铛。” “怎么了墨礁?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵幢竹,是天一觀的道長。 經(jīng)常有香客問我恩静,道長焕毫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任驶乾,我火速辦了婚禮邑飒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘级乐。我一直安慰自己疙咸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布风科。 她就那樣靜靜地躺著撒轮,像睡著了一般乞旦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上题山,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天兰粉,我揣著相機(jī)與錄音,去河邊找鬼顶瞳。 笑死亲桦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浊仆。 我是一名探鬼主播客峭,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抡柿!你這毒婦竟也來了舔琅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤洲劣,失蹤者是張志新(化名)和其女友劉穎备蚓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囱稽,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郊尝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了战惊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片流昏。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吞获,靈堂內(nèi)的尸體忽然破棺而出况凉,到底是詐尸還是另有隱情,我是刑警寧澤各拷,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布刁绒,位于F島的核電站,受9級特大地震影響烤黍,放射性物質(zhì)發(fā)生泄漏知市。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一速蕊、第九天 我趴在偏房一處隱蔽的房頂上張望嫂丙。 院中可真熱鬧,春花似錦互例、人聲如沸奢入。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腥光。三九已至,卻和暖如春糊秆,著一層夾襖步出監(jiān)牢的瞬間武福,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工痘番, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捉片,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓汞舱,卻偏偏與公主長得像伍纫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子昂芜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容