這篇文章將為大家詳細(xì)講解有關(guān)spring注入對(duì)象的方法和創(chuàng)建bean的步驟,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)為客戶提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、程序、域名、空間一條龍服務(wù),提供基于WEB的系統(tǒng)開(kāi)發(fā). 服務(wù)項(xiàng)目涵蓋了網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站程序開(kāi)發(fā)、WEB系統(tǒng)開(kāi)發(fā)、微信二次開(kāi)發(fā)、手機(jī)網(wǎng)站開(kāi)發(fā)等網(wǎng)站方面業(yè)務(wù)。
首先需要知道一個(gè)大致實(shí)現(xiàn)
● 這個(gè)注入過(guò)程肯定是在 BeanPostProcessor 中實(shí)現(xiàn)的
●spring 是在 beanFactory.getBean 進(jìn)行 bean 實(shí)例化的,即懶加載
● 根據(jù)第二條,也就是說(shuō)在 getBean 的時(shí)候才會(huì)去調(diào)用所有 BeanPostProcessor
● 第二篇文章說(shuō)到,BeanFactory 的 refresh 過(guò)程只是注冊(cè) BeanPostProcessor,真正執(zhí)行在 getBean 方法中
MergedBeanDefinitionPostProcessor 也是一種 BeanPostProcessor 它重新弄了個(gè)一個(gè)生命周期函數(shù),替代了 BeanPostProcessor 默認(rèn)的生命周期函數(shù),這么看吧,我貼一小段源碼
for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof MergedBeanDefinitionPostProcessor) { MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp; bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName); } }
它允許你在非 BeanFactoryProcess 中去修改 Bean 定義
InstantiationAwareBeanPostProcessor 也是一種 BeanPostProcessor 它也重新定義了一個(gè)生命周期函數(shù),它允許把屬性值注入到屬性對(duì)象中
@Autowired 加載定義的過(guò)程
我們先不看 bean 的創(chuàng)建過(guò)程,就看 MergedBeanDefinitionPostProcessor 的實(shí)現(xiàn)子類,這里看名字猜測(cè)
AutowiredAnnotationBeanPostProcessor 應(yīng)該就是干這件事的,所以我們接下來(lái)可以直接看
AutowiredAnnotationBeanPostProcessor 的 postProcessMergedBeanDefinition 方法的代碼。
順著方法的調(diào)用,可以知道在 buildAutowiringMetadata 是真正查找這些注解的地方,最后 checkConfigMembers 將 Member 注冊(cè)進(jìn)了 bean 定義,具體如何查找的讀者自行查看源碼。
這里只是將 Member 注冊(cè)進(jìn)了 bean 定義,真正實(shí)例化在填充 Bean 的過(guò)程中,下面說(shuō)到 bean 的創(chuàng)建過(guò)程可以知道是何時(shí)注入的。
Bean 的創(chuàng)建過(guò)程
前面說(shuō)到 spring 是在 getBean 的過(guò)程中進(jìn)行 Bean 創(chuàng)建的,創(chuàng)建 bean 分為幾個(gè)步驟
1. 獲取 bean 定義
2. new Bean()
3. 執(zhí)行生命周期函數(shù) (前)
4. 創(chuàng)建依賴項(xiàng)
5. 填充 bean
6. 執(zhí)行生命周期函數(shù)(后)
入口為 BeanFactory.getBean ,BeanFactory 的實(shí)現(xiàn)類為 DefaultListableBeanFactory 這些你可以在 BeanFactory 的 refresh 過(guò)程中找到
根據(jù)源碼,如果 bean 還不存在時(shí),就會(huì)執(zhí)行 bean 的創(chuàng)建流程
獲取 bean 定義在這段源碼中
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
緊跟著,根據(jù) Bean 定義搜索其依賴項(xiàng),并創(chuàng)建 bean ,可以看出是遞歸創(chuàng)建 bean
String[] dependsOn = mbd.getDependsOn(); for (String dep : dependsOn) { getBean(dep); }
然后就創(chuàng)建 bean 了
if (mbd.isSingleton()) { createBean(beanName, mbd, args); } // 真正的執(zhí)行在 doCreateBean 過(guò)程中 Object beanInstance = doCreateBean(beanName, mbdToUse, args);
創(chuàng)建 bean 第一步 new Bean
if (instanceWrapper == null) { instanceWrapper = createBeanInstance(beanName, mbd, args); }
創(chuàng)建 bean 第二步,執(zhí)行所有的 processor ,包含 MergedBeanDefinitionPostProcessor ,所以在這一步注冊(cè)注入選項(xiàng)
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
創(chuàng)建 bean 第三步,填充 bean ,這里做的 @Autowired 注入
populateBean(beanName, mbd, instanceWrapper);
最終的處理過(guò)程在 AutowiredAnnotationBeanPostProcessor 的 postProcessPropertyValues 函數(shù)中
metadata.inject(bean, beanName, pvs);
因?yàn)樵谇懊嬉呀?jīng)獲取過(guò)依賴項(xiàng),并且把其丟進(jìn)了容器,所以這里是直接用反射寫(xiě)進(jìn)去就可以了
創(chuàng)建 bean 第四步,初始化 bean ,這里有一個(gè)方法注入,方法注入原來(lái)發(fā)生在初始化 bean 過(guò)程中,還有就是生命周期函數(shù)執(zhí)行了,包含 BeanPostProcessor 的前置后置生命周期,初始化方法等
小說(shuō)明 :AutowiredAnnotationBeanPostProcessor 即是 一個(gè) MergedBeanDefinitionPostProcessor 也是一個(gè) InstantiationAwareBeanPostProcessor
關(guān)于spring注入對(duì)象的方法和創(chuàng)建bean的步驟就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
網(wǎng)站標(biāo)題:spring注入對(duì)象的方法和創(chuàng)建bean的步驟
當(dāng)前網(wǎng)址:http://www.rwnh.cn/article4/ippsie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、微信公眾號(hào)、企業(yè)建站、網(wǎng)站維護(hù)、外貿(mào)建站、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)