欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Spring源碼怎樣分析ioc容器

今天就跟大家聊聊有關(guān)Spring源碼怎樣分析ioc容器,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

成都創(chuàng)新互聯(lián)公司基于成都重慶香港及美國等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動(dòng)大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)成都服務(wù)器托管報(bào)價(jià),主機(jī)托管價(jià)格性價(jià)比高,為金融證券行業(yè)服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專業(yè)成都idc公司。

無論是基于xml配置文件方式還是基于@Configuration注解配置類方式,spring都是將我們配置的bean解析為BeanDefinition對象的,一個(gè)BeanDefinition就是對一個(gè)bean的定義,BeanDefinition存儲(chǔ)了一個(gè)bean的類名、實(shí)例化這個(gè)bean將使用的構(gòu)造參數(shù)及參數(shù)值、實(shí)例化這個(gè)bean時(shí)需要注入的字段名和字段的值等。

BeanDefinition的是對一個(gè)對象的描述,比如說你現(xiàn)在想讓技術(shù)員幫你組裝一臺(tái)電腦,技術(shù)員就會(huì)向你詢問你想要怎樣的一臺(tái)電腦,對cpu的要求、對顯卡的要求是什么,以及對內(nèi)存的要求等,然后技術(shù)員就會(huì)根據(jù)你的要求去給你組裝電腦,你可能是跟朋友一起組裝,要求同一樣的配置。這時(shí)候,你對組裝電腦的要求就是對電腦的定義,spring中對bean的定義就是BeanDefinition,如果你只是想要一臺(tái),那么技術(shù)員就只會(huì)給你組裝一臺(tái),這就是單例,spring中bean工廠就相當(dāng)于技術(shù)員的角色,而如果你是想要一樣的配置組裝多臺(tái)電腦這就可以理解為原型。

如果是使用xml配置文件方式,那么spring首先會(huì)讀取xml配置文件,將xml文件解析為一個(gè)個(gè)節(jié)點(diǎn),然后獲取配置文件中的<bean>節(jié)點(diǎn),根據(jù)這些bean節(jié)點(diǎn)創(chuàng)建BeanDefinition對象。默認(rèn)會(huì)使用無參數(shù)構(gòu)造函數(shù)實(shí)例化目標(biāo)bean,但如果這個(gè)bean在配置文件中指定了構(gòu)造參數(shù),那么這些構(gòu)造參數(shù)的配置也會(huì)存儲(chǔ)在BeanDefinition對象中,在實(shí)例化的時(shí)候spring就會(huì)尋找匹配的構(gòu)造函數(shù)使用配置文件中配置的參數(shù)值來實(shí)例化這個(gè)bean。在xml文件中配置bean的時(shí)候構(gòu)造參數(shù)和屬性注入都可以是ref引用別的bean,這就是依賴,spring會(huì)保證在實(shí)例化這個(gè)bean之前先實(shí)例化依賴的bean。

使用注解配置類方式會(huì)有些不同,如果實(shí)例化AnnotationConfigApplicationContext應(yīng)用上下文的時(shí)候使用的是指定注解配置類的構(gòu)造方法,那么會(huì)先注冊這個(gè)注解配置類到bean工廠,也就是將這個(gè)配置類解析為一個(gè)BeanDefinition對象注冊到bean工廠,然后在refresh階段先初始化bean工廠(做一些配置)之后再調(diào)用bean工廠后置處理器。上一篇介紹重點(diǎn)介紹了ConfigurationClassPostProcessor這個(gè)spring自己注入的bean,這也是一個(gè)bean工廠后置處理器。在bean工廠后置處理器ConfigurationClassPostProcessor中解析配置類的BeanDefinition對象,就是處理配置類上的注解和其方法體內(nèi)的@Bean方法。

如果配置類(此時(shí)配置類已經(jīng)是一個(gè)BeanDefinition對象)上有掃描包的注解就去掃描指定包,掃描指定包下被@Component等注解的類將其解析為BeanDefinition對象,最后將掃描的BeanDefinition結(jié)果集注冊到bean工廠。如果掃描結(jié)果中有@Configuration注解配置類,后續(xù)還會(huì)繼續(xù)解析掃描到的注解配置類(被@Configuration注解的BeanDefinition對象)。如果當(dāng)前配置類有@Import注解,會(huì)先處理@Import導(dǎo)入的bean或者注解配置類。@Bean就相對復(fù)雜一點(diǎn),這里就先不提。這是一個(gè)廣度優(yōu)先遍歷,直到所有的bean都被注冊以及所有的注解配置類都被解析處理。

如果bean配置了懶初始化,那么只有在我們調(diào)用工廠的getBean方法的時(shí)候才會(huì)去實(shí)例化這個(gè)bean,當(dāng)然如果這個(gè)bean是單例的且其它bean會(huì)依賴這個(gè)bean,那么在其它bean實(shí)例化的時(shí)候也會(huì)將這個(gè)bean先實(shí)例化。

bean的實(shí)例化是根據(jù)beanName獲取到其BeanDefinition對象,根據(jù)BeanDefinition對象中保存的bean的ClassName并使用bean工廠的類加載器來這個(gè)ClassName的Class對象,最后才調(diào)用這個(gè)Class對象的newInstance方法實(shí)例化bean。實(shí)例化bean完成之后還會(huì)使用BeanUtil工具類為其屬性賦值,就是我們配置的這個(gè)bean需要注入的屬性。

在bean實(shí)例化完成且注入屬性值之后會(huì)調(diào)用配置的初始化方法(如果有initMethod或者這個(gè)bean實(shí)現(xiàn)了InitializingBean接口)。在調(diào)用初始化方法之前會(huì)先調(diào)用bean后置處理器BeanPostProcessor的postProcessBeforeInitialization方法,且在調(diào)用初始化方法完成之后會(huì)調(diào)用BeanPostProcessor的postProcessAfterInitialization方法。這些BeanPostProcessor可以不止一個(gè),你可以注入多個(gè),多個(gè)BeanPostProcessor都會(huì)被調(diào)用,且bean工廠中每個(gè)bean在調(diào)用初始化方法前后都會(huì)調(diào)用這些BeanPostProcessor。

前面幾篇所講的內(nèi)容基本上也就那么多了,還有很多內(nèi)容是沒講到的,因?yàn)閟pring的復(fù)雜并不是這么簡短的文字就能說完的,不復(fù)雜又怎么會(huì)這么強(qiáng)大呢?還有spring的aop功能的實(shí)現(xiàn),如果有時(shí)間我還會(huì)繼續(xù)分析,但也可能會(huì)暫停下來而去學(xué)習(xí)新的技能:spring cloud。

看完上述內(nèi)容,你們對Spring源碼怎樣分析ioc容器有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

網(wǎng)站題目:Spring源碼怎樣分析ioc容器
鏈接URL:http://www.chinadenli.net/article2/jdgcoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)電子商務(wù)網(wǎng)站策劃Google網(wǎng)站設(shè)計(jì)軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)