? ? 入口依舊是在refresh方法中疮装,之前提到了obtainFreshBeanFactory是類加載完成后構(gòu)建BeanDefinition缘琅,構(gòu)建完成之后就需要對Bean進(jìn)行實例化了。關(guān)注invokeBeanFactoryPostProcessors(負(fù)責(zé)BeanFactoryPostProcessor和BeanDefinitionRegisterPostProcessor這兩個接口的調(diào)用)和registerBeanPostProcessors(負(fù)責(zé)把實現(xiàn)了BeanPostProcessor的接口的類實例化后廓推,加入BeanFactory中)方法刷袍。
invokeBeanFactoryPostProcessors
????該方法主要作用是為了獲取BeanFactoryPostProcessor或者BeanDefinitionRegisterPostProcessor的實例。為了方便調(diào)試樊展,我們自定義一個BeanDefinitionRegisterPostProcessor呻纹,并重寫里面的postProcessBeanDefinitionRegistry和postProcessBeanFactory方法(從BeanDefinitionRegisterPostProcessor的源碼來看,發(fā)現(xiàn)它是繼承了BeanFactoryPostProcessor专缠,因此無需單獨實現(xiàn)BeanFactoryPostProcessor雷酪,如圖1)。
????別忘了在xml中配置bean涝婉,圖2為實現(xiàn)了BeanDefinitionRegisterPostProcessor的自定義類哥力,并打印了代碼運行后的日志信息。
BeanDefinitionRegisterPostProcessor
? ? 進(jìn)來源碼后嘁圈,分三部分依次調(diào)用:1省骂、調(diào)用實現(xiàn)了PriorityOrdered排序接口;2最住、調(diào)用實現(xiàn)了Ordered排序接口;3怠惶、沒有調(diào)用任何排序接口涨缚。PriorityOrdered是Ordered接口的子類,兩者完全一樣,只不過在Spring中脓魏,實現(xiàn)了PriorityOrdered接口的類會喲與更高的優(yōu)先級兰吟。
? ? 下面的操作會對上述每一部分都執(zhí)行一遍,如圖3
? ? 1茂翔、調(diào)用getBeanNameForType混蔼,再往下看,最終調(diào)用的是doGetBeanNamesForType珊燎,這個方法首先是迭代循環(huán)之前存到緩存中的beanDefinitionNames惭嚣,然后獲取到實現(xiàn)了BeanDefinitionRegistryPostProcessor接口的所有類的BeanDefinition所對應(yīng)的beanName,但是對于FactoryBean來說悔政,還需要加上“&”前綴晚吞,如圖4。
否則后面獲取到的就不是FactoryBean對象了谋国,而是實現(xiàn)了getObject方法返回的實例槽地。如圖5,這是實現(xiàn)了FactoryBean的類芦瘾;圖6是獲取到的不同對象:
? ? 2捌蚊、對實現(xiàn)了排序接口的類進(jìn)行排序:
? ? 3、調(diào)用invokeBeanDefinitionRegistryPostProcessors調(diào)用實現(xiàn)了排序接口的BeanDefinitionRegistryPostProcessor近弟,就能調(diào)用到我們自定義的重寫方法postProcessBeanDefinitionRegistry逢勾,如圖7:
-----------------------------------------------------------------------------------------------------------------------------------
BeanFactoryPostProcessor
? ? 同BeanDefinitionRegistryPostProcessor一樣的操作邏輯,最終調(diào)用的是invokeBeanFactoryPostProcessors藐吮,就能調(diào)用到我們自定義的重寫方法postProcessBeanFactory溺拱,如圖8,是獲取到實現(xiàn)幾個排序接口的beanName谣辞;如圖9則是和上面的使用方式一樣:
registerBeanPostProcessors
? ? 首先調(diào)用getBeanNameForType獲取到所有實現(xiàn)了BeanPostProcessor接口的BeanDefinition的beanName迫摔,然后依次判斷是否實現(xiàn)了PriorityOrdered、Ordered或者沒有實現(xiàn)排序接口泥从,都會用各自的List包括起來句占。
? ? 遍歷對應(yīng)的List對象,通過getBean獲取到BeanPostProcessor后躯嫉,會去判斷獲取到的BeanPostProcessor的類型是否是MergedBeanDefinitionPostProcessor纱烘,如果是的話添加到internalPostProcessors(內(nèi)部使用)中。用sortPostProcessors排序后祈餐,調(diào)用registerBeanPostProcessors擂啥,把前面的三個實現(xiàn)排序接口的BeanPostProcessor和internalPostProcessors注冊進(jìn)BeanFactory中,如圖10:
? ? 上面提到了getBean方法就是獲取實例的方法帆阳,因為涉及到的東西比較多哺壶,放到getBean中來講。
????https://github.com/LuoChen1996/my_spring.git