内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Spring源碼怎樣分析ioc容器

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

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

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

BeanDefinition的是對(duì)一個(gè)對(duì)象的描述,比如說(shuō)你現(xiàn)在想讓技術(shù)員幫你組裝一臺(tái)電腦,技術(shù)員就會(huì)向你詢(xún)問(wèn)你想要怎樣的一臺(tái)電腦,對(duì)cpu的要求、對(duì)顯卡的要求是什么,以及對(duì)內(nèi)存的要求等,然后技術(shù)員就會(huì)根據(jù)你的要求去給你組裝電腦,你可能是跟朋友一起組裝,要求同一樣的配置。這時(shí)候,你對(duì)組裝電腦的要求就是對(duì)電腦的定義,spring中對(duì)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對(duì)象。默認(rèn)會(huì)使用無(wú)參數(shù)構(gòu)造函數(shù)實(shí)例化目標(biāo)bean,但如果這個(gè)bean在配置文件中指定了構(gòu)造參數(shù),那么這些構(gòu)造參數(shù)的配置也會(huì)存儲(chǔ)在BeanDefinition對(duì)象中,在實(shí)例化的時(shí)候spring就會(huì)尋找匹配的構(gòu)造函數(shù)使用配置文件中配置的參數(shù)值來(lái)實(shí)例化這個(gè)bean。在xml文件中配置bean的時(shí)候構(gòu)造參數(shù)和屬性注入都可以是ref引用別的bean,這就是依賴(lài),spring會(huì)保證在實(shí)例化這個(gè)bean之前先實(shí)例化依賴(lài)的bean。

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

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

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

bean的實(shí)例化是根據(jù)beanName獲取到其BeanDefinition對(duì)象,根據(jù)BeanDefinition對(duì)象中保存的bean的ClassName并使用bean工廠的類(lèi)加載器來(lái)這個(gè)ClassName的Class對(duì)象,最后才調(diào)用這個(gè)Class對(duì)象的newInstance方法實(shí)例化bean。實(shí)例化bean完成之后還會(huì)使用BeanUtil工具類(lèi)為其屬性賦值,就是我們配置的這個(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)容是沒(méi)講到的,因?yàn)閟pring的復(fù)雜并不是這么簡(jiǎn)短的文字就能說(shuō)完的,不復(fù)雜又怎么會(huì)這么強(qiáng)大呢?還有spring的aop功能的實(shí)現(xiàn),如果有時(shí)間我還會(huì)繼續(xù)分析,但也可能會(huì)暫停下來(lái)而去學(xué)習(xí)新的技能:spring cloud。

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

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

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

廣告

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

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)
普陀区| 永嘉县| 宁河县| 阿克苏市| 葵青区| 田林县| 高台县| 屯门区| 全州县| 琼海市| 日喀则市| 桂平市| 盐城市| 石嘴山市| 定兴县| 望奎县| 临海市| 灵寿县| 府谷县| 武义县| 金华市| 金川县| 岱山县| 建始县| 仙桃市| 临江市| 宜丰县| 海兴县| 丹寨县| 子长县| 涟源市| 德阳市| 宣武区| 丰镇市| 澎湖县| 无棣县| 个旧市| 青冈县| 丹棱县| 开平市| 宁乡县|