spring源碼

普通類實(shí)例過程:首先會(huì)有一個(gè)類裝載器(classloader)將類裝載到內(nèi)存,jvm的字節(jié)碼編譯器把字節(jié)碼變異成機(jī)器碼然后再返回一個(gè)class對(duì)象就可以用這個(gè)對(duì)象了
Snip20190525_9.png

spring如何創(chuàng)建bean

同樣先把java類通過classloader加載到class,Spring容器一啟動(dòng)就會(huì)去掃描這些class,將class掃描變成BeanDefinition(用來描述我們的class的),再將BeanDefinition放到一個(gè)map中如圖綠色框,map中就描述了某個(gè)class的信息,spring再通過循環(huán)遍歷這個(gè)map,把map中所有的BeanDefinition拿出來,再通過preinstantiatesingletons方法把BeanDefinition變成一個(gè)bean,這個(gè)bean會(huì)放到spring IOC容器中,最后通過getbean方法拿到bean對(duì)象。

所以spring new一個(gè)對(duì)象跟class沒有關(guān)系,跟BeanDefinitionMap有關(guān)系

注意可以人為干預(yù)Spring創(chuàng)建bean的過程

可以通過其中的一個(gè)拓展點(diǎn)BeanFactoryPostProcessor這個(gè)接口去插手BeanDefinitionMap人為把這個(gè)map改了
BeanFactoryPostProcessor只能修改不能往BeanDefinitionMap添加BeanDefinition

問題:為什么需要?jiǎng)討B(tài)注冊(cè)bean

大部分時(shí)候,靜態(tài)的配置信息即可滿足系統(tǒng)需求。但是某些場景下,我們需要根據(jù)靜態(tài)配置中的信息動(dòng)態(tài)生成bean,此時(shí)就需要?jiǎng)討B(tài)注冊(cè)bean的功能。
如:用戶定義一個(gè)如下的接口,而接口的實(shí)現(xiàn)則由框架生成,不需要用戶自行編寫,此時(shí)實(shí)現(xiàn)類就需要?jiǎng)討B(tài)注冊(cè)到容器中。

問題:一個(gè)接口如何調(diào)用一個(gè)方法:動(dòng)態(tài)代理或者factorybean

借助ImportBeanDefinitionRegistrar接口實(shí)現(xiàn)bean的動(dòng)態(tài)注入

A801316CDD066AB3E3CFE7E8E6152721.png

Snip20190525_10.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容