版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Spring注解驅(qū)動(dòng)之BeanDefinitionRegistryPostProcessor原理解析目錄BeanDefinitionRegistryPostProcessor概述案例實(shí)踐源碼分析小結(jié)
BeanDefinitionRegistryPostProcessor概述
可以看到BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子接口。
注釋中說(shuō)執(zhí)行時(shí)機(jī)是所有合法的bean定義已經(jīng)加載,但是還沒(méi)實(shí)例化。
看起來(lái)和BeanFactoryPostProcessor執(zhí)行時(shí)機(jī)差不多,但是BeanFactoryPostProcessor的注釋是所有bean定義被加載,而B(niǎo)eanDefinitionRegistryPostProcessor是所有合法的bean定義。
接著看注釋:
Thisallowsforaddingfurtherbeandefinitionsbeforethenextpost-processingphasekicksin.
意思是BeanDefinitionRegistryPostProcessor允許添加將來(lái)的bean定義在下一個(gè)后置處理器階段開(kāi)始之前。簡(jiǎn)單說(shuō)就是還可以往容器中增加新的bean的定義。
因此,大概率BeanDefinitionRegistryPostProcessor的執(zhí)行順序在BeanFactoryPostProcessor之前。
案例實(shí)踐
首先,編寫(xiě)一個(gè)類(lèi),例如MyBeanDefinitionRegistryPostProcessor,它應(yīng)要實(shí)現(xiàn)BeanDefinitionRegistryPostProcessor這個(gè)接口。
packagecom.meimeixia.ext;
importorg.springframework.beans.BeansException;
importorg.springframework.beans.factory.config.ConfigurableListableBeanFactory;
importorg.springframework.beans.factory.support.AbstractBeanDefinition;
importorg.springframework.beans.factory.support.BeanDefinitionBuilder;
importorg.springframework.beans.factory.support.BeanDefinitionRegistry;
importorg.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
importorg.springframework.beans.factory.support.RootBeanDefinition;
importorg.springframework.stereotype.Component;
importcom.meimeixia.bean.Blue;
//記住,我們這個(gè)組件寫(xiě)完之后,一定別忘了給它加在容器中
@Component
publicclassMyBeanDefinitionRegistryPostProcessorimplementsBeanDefinitionRegistryPostProcessor{
@Override
publicvoidpostProcessBeanFactory(ConfigurableListableBeanFactorybeanFactory)throwsBeansException{
//TODOAuto-generatedmethodstub
System.out.println("MyBeanDefinitionRegistryPostProcessor...bean的數(shù)量:"+beanFactory.getBeanDefinitionCount());
*這個(gè)BeanDefinitionRegistry就是Bean定義信息的保存中心,這個(gè)注冊(cè)中心里面存儲(chǔ)了所有的bean定義信息,
*以后,BeanFactory就是按照BeanDefinitionRegistry里面保存的每一個(gè)bean定義信息來(lái)創(chuàng)建bean實(shí)例的。
*bean定義信息包括有哪些呢?有這些,這個(gè)bean是單例的還是多例的、bean的類(lèi)型是什么以及bean的id是什么。
*也就是說(shuō),這些信息都是存在BeanDefinitionRegistry里面的。
@Override
publicvoidpostProcessBeanDefinitionRegistry(BeanDefinitionRegistryregistry)throwsBeansException{
//TODOAuto-generatedmethodstub
System.out.println("postProcessBeanDefinitionRegistry...bean的數(shù)量:"+registry.getBeanDefinitionCount());
//除了查看bean的數(shù)量之外,我們還可以給容器里面注冊(cè)一些bean,我們以前也簡(jiǎn)單地用過(guò)
*第一個(gè)參數(shù):我們將要給容器中注冊(cè)的bean的名字
*第二個(gè)參數(shù):BeanDefinition對(duì)象
//RootBeanDefinitionbeanDefinition=newRootBeanDefinition(Blue.class);//現(xiàn)在我準(zhǔn)備給容器中添加一個(gè)Blue對(duì)象
//咱們也可以用另外一種辦法,即使用BeanDefinitionBuilder這個(gè)構(gòu)建器生成一個(gè)BeanDefinition對(duì)象,很顯然,這兩種方法的效果都是一樣的
AbstractBeanDefinitionbeanDefinition=BeanDefinitionBuilder.rootBeanDefinition(Blue.class).getBeanDefinition();
registry.registerBeanDefinition("hello",beanDefinition);
測(cè)試結(jié)果
可以看到,BeanDefinitionRegistryPostProcessor里面的兩個(gè)方法,postProcessBeanDefinitionRegistry在postProcessBeanFactory之前執(zhí)行。
BeanDefinitionRegistryPostProcessor比BeanFactoryPostProcessor先執(zhí)行。
源碼分析
自己在測(cè)試示例中方法打斷點(diǎn),然后查看調(diào)用棧即可,下面是一些主要的代碼片段。
繼續(xù)向下看,可以看到會(huì)取出所有實(shí)現(xiàn)了BeanDefinitionRegistryPostProcessor接口的類(lèi),即從容器中獲取到所有的BeanDefinitionRegistryPostProcessor組件。
然后,優(yōu)先調(diào)用實(shí)現(xiàn)了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor組件。
點(diǎn)進(jìn)去這個(gè)方法里面一看究竟,原來(lái)是先調(diào)用完BeanDefinitionRegistryPostProcessor組件里面的postProcessBeanDefinitionRegistry方法,然后再來(lái)調(diào)用它里面的postProcessBeanFactory方法。
我們?cè)賮?lái)仔細(xì)看一下PostProcessorRegistrationDelegate類(lèi)中的invokeBeanFactoryPostProcessors方法,只不過(guò)這時(shí)是從程序停留的地方(即第122行代碼處)往下看,如下圖所示。
小結(jié)
BeanDefinitionRegistryPostProcessor的執(zhí)行流程。
1.創(chuàng)建IOC容器。
2.調(diào)用refresh方法。
3.從IOC容器中獲取所有的BeanDefinitionRegistryPostProcessor組
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年NFT數(shù)字藝術(shù)品銷(xiāo)售合同
- 安全員A證考試考前沖刺練習(xí)試題及完整答案詳解(奪冠)
- 燃?xì)夤艿澜](méi)區(qū)設(shè)計(jì)方案
- 安全員A證考試通關(guān)考試題庫(kù)含答案詳解(研優(yōu)卷)
- 安全員A證考試全真模擬模擬題及參考答案詳解(培優(yōu))
- 安全員A證考試真題匯編含完整答案詳解【各地真題】
- 安全員A證考試練習(xí)題(一)附參考答案詳解(完整版)
- 安全員A證考試通關(guān)模擬題庫(kù)及參考答案詳解(綜合卷)
- 安全員A證考試復(fù)習(xí)提分資料含答案詳解【綜合卷】
- 安全員A證考試模擬卷包及答案詳解一套
- 南京醫(yī)科大學(xué)2026年招聘人事代理人員備考題庫(kù)及1套參考答案詳解
- 2026年教育平臺(tái)資源輸出協(xié)議
- 【《四旋翼飛行器坐標(biāo)系及相互轉(zhuǎn)換關(guān)系分析綜述》1000字】
- 2026浙江金華市婺城區(qū)城市發(fā)展控股集團(tuán)有限公司招聘59人筆試參考題庫(kù)及答案解析
- 靜脈補(bǔ)液課件
- 廣東深圳市鹽田高級(jí)中學(xué)2024~2025學(xué)年高一上冊(cè)1月期末考試化學(xué)試題 附答案
- 2026年輔警招聘考試試題庫(kù)附答案【完整版】
- 建筑施工風(fēng)險(xiǎn)辨識(shí)與防范措施
- 浙江省杭州地區(qū)六校2026屆化學(xué)高一第一學(xué)期期末學(xué)業(yè)水平測(cè)試試題含解析
- 2025年CFA二級(jí)估值與財(cái)務(wù)報(bào)表分析試卷(含答案)
- 2025年宜昌化學(xué)真題試卷及答案
評(píng)論
0/150
提交評(píng)論