Spring源碼怎樣分析ioc容器

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

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

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

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

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

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

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

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

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

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

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

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

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

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

廣告

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

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