詳解SpringIOC BeanDeifition
BeanDefiton是什么?
BeanDefition是Spring對(duì)POJO的抽象,通過(guò)BeanDefition來(lái)更好地創(chuàng)建、管理Bean。
| 定義 | 含義 |
|---|---|
| beanClassName | bean的類(lèi)名。該屬性并不總是對(duì)應(yīng)著bean真正使用的類(lèi)的名稱(chēng)。bean通過(guò)某個(gè)類(lèi)的靜態(tài)工廠(chǎng)方法生成,那么這beanClassName就是該類(lèi);bean通過(guò)工廠(chǎng)Bean生成,那么這里為null |
| scope | 作用域 singleton 或者 prototype |
| lazyInit | 是否懶加載 BeanFacotry中的Bean默認(rèn)懶加載,ApplicationContext在初始化階段就會(huì)實(shí)例化 |
| dependsOn | 所依賴(lài)的bean的名稱(chēng) 在抽象類(lèi)AbstractBeanFacotry中 dependsOn是一個(gè)String數(shù)組,保證這些被依賴(lài)的bean優(yōu)先被實(shí)例化。 |
| factoryBeanName | 如果使用factoryBean來(lái)創(chuàng)建bean,這里指定了相應(yīng)的工廠(chǎng)bean的類(lèi)名稱(chēng) |
| facotryMethodName | 工廠(chǎng)方法名稱(chēng),基于類(lèi)的靜態(tài)工廠(chǎng)方法的情況下,結(jié)合beanClassName使用,基于工廠(chǎng)bean的情況下,結(jié)合facotryBeanName使用,如果bean定義下的constructArugmentValues有內(nèi)容,工廠(chǎng)方法會(huì)在被調(diào)用時(shí)使用該屬性 |
| role | bean的角色:APPLICATION,SUPPORT,INFRASTRUCTURE。提示框架該bean的角色和重要程度。 |
AbstractBeanDefition
AbstractBeanDefition是對(duì)BeanDefition的補(bǔ)充,定義了一些公共配置和公共能力,不加以贅述。
全功能的BeanDefiton
RootBeanDefinition
不能設(shè)置parentbean定義,他本身就是根
ChildBeanDefinition
必須設(shè)置parent bean定義,而且必須通過(guò)構(gòu)造函數(shù)指定
GenricBeanDefinition
動(dòng)態(tài)設(shè)置parent bean,也可以不設(shè)置parent beand 相對(duì)更加靈活
MergedBeanDefinition
筆者在閱讀Spring源碼時(shí),注意到MergedBeanDefinition和getMergedLocalBeanDefinition方法,而MergedBeanDefition只是Spring中一個(gè)抽象的BeanDefition概念,其本質(zhì)上是一個(gè)RootBeanDefinition。
MergedBeanDefinition從中文上理解是合并的bean,上文提到BeanDefition中規(guī)范了parentbean,Spring會(huì)檢查bean對(duì)應(yīng)的BeanDefitione,智能合并bean與parentbean。
通過(guò)getMergedLocalBeanDefinition方法摘要,加深一下理解。
synchronized (this.mergedBeanDefinitions) {
//mbd->mergedBeanDefinition
RootBeanDefinition mbd = null;
RootBeanDefinition previous = null;
if (mbd == null || mbd.stale) {
previous = mbd;
/** bd.getParentName() == null 代表著
該beanDefition是一個(gè)RootBeanDefition
或者該beanDefition是一個(gè)沒(méi)有parentBean的GenricBeanDefition
**/
if (bd.getParentName() == null) {
if (bd instanceof RootBeanDefinition) {
mbd = ((RootBeanDefinition) bd).cloneBeanDefinition();
}
else {
mbd = new RootBeanDefinition(bd);
}
}
/**該beanDefition是一個(gè)ChildBeanDefition**/
else {
BeanDefinition pbd;
String parentBeanName = transformedBeanName(bd.getParentName());
if (!beanName.equals(parentBeanName)) {
pbd = getMergedBeanDefinition(parentBeanName);
}
else {
BeanFactory parent = getParentBeanFactory();
if (parent instanceof ConfigurableBeanFactory) {
/遞歸式調(diào)用/
pbd = ((ConfigurableBeanFactory) parent).getMergedBeanDefinition(parentBeanName);
}
mbd = new RootBeanDefinition(pbd);
mbd.overrideFrom(bd);
}
}
return mbd;
}
以上就是詳解SpringIOC BeanDeifition的詳細(xì)內(nèi)容,更多關(guān)于SpringIOC BeanDeifition的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 詳解SpringIOC容器中bean的作用范圍和生命周期
- Spring IOC原理補(bǔ)充說(shuō)明(循環(huán)依賴(lài)、Bean作用域等)
- Spring IOC裝配Bean過(guò)程解析
- Spring為IOC容器注入Bean的五種方式詳解
- Spring bean的實(shí)例化和IOC依賴(lài)注入詳解
- 關(guān)于SpringBoot獲取IOC容器中注入的Bean(推薦)
- spring在IoC容器中裝配Bean詳解
- spring ioc的簡(jiǎn)單實(shí)例及bean的作用域?qū)傩越馕?/a>
- 淺談springioc實(shí)例化bean的三個(gè)方法
- 基于springioc bean 的幾個(gè)屬性介紹
- 詳解Spring框架---IOC裝配Bean
- Spring IOC:CreateBean環(huán)節(jié)中的流程轉(zhuǎn)換
相關(guān)文章
Spring?Boot中的過(guò)濾器攔截器監(jiān)聽(tīng)器使用技巧匯總
本文將介紹在Spring?Boot應(yīng)用程序中使用過(guò)濾器、攔截器和監(jiān)聽(tīng)器的使用技巧,我們將討論它們之間的區(qū)別,以及何時(shí)使用它們,我們還將提供代碼示例,以幫助您在自己的應(yīng)用程序中使用它們2023-12-12
淺談mybatis中SQL語(yǔ)句給boolean類(lèi)型賦值問(wèn)題
這篇文章主要介紹了淺談mybatis中SQL語(yǔ)句給boolean類(lèi)型賦值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
Mybatis中ResultMap解決屬性名和數(shù)據(jù)庫(kù)字段名不一致問(wèn)題
我們Pojo類(lèi)的屬性名和數(shù)據(jù)庫(kù)中的字段名不一致的現(xiàn)象時(shí)有發(fā)生,本文就詳細(xì)的介紹一下Mybatis中ResultMap解決屬性名和數(shù)據(jù)庫(kù)字段名不一致問(wèn)題,感興趣的可以了解一下2021-10-10
Java多條件判斷場(chǎng)景中規(guī)則執(zhí)行器的設(shè)計(jì)
近日在公司領(lǐng)到一個(gè)小需求,需要對(duì)之前已有的試用用戶(hù)申請(qǐng)規(guī)則進(jìn)行拓展。本文去掉if 判斷,試試用一個(gè)規(guī)則執(zhí)行器來(lái)替代它,感興趣的可以了解一下2021-06-06
一文帶你學(xué)會(huì)規(guī)則引擎Drools的應(yīng)用
Drools?就是一個(gè)開(kāi)源的業(yè)務(wù)規(guī)則引擎,可以很容易地與?spring?boot?應(yīng)用程序集成,這篇文章就來(lái)和大家詳細(xì)聊聊Drools的具體應(yīng)用,需要的可以參考一下2023-03-03
spring注入配置文件屬性到j(luò)ava類(lèi)
這篇文章主要為大家介紹了spring注入配置文件屬性到j(luò)ava類(lèi)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
java數(shù)學(xué)工具類(lèi)Math詳解(round方法)
這篇文章主要為大家詳細(xì)介紹了java數(shù)學(xué)工具類(lèi)Math,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
Gradle環(huán)境下導(dǎo)出Swagger為PDF的步驟詳解
這篇文章主要介紹了Gradle環(huán)境下導(dǎo)出Swagger為PDF的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
java正則表達(dá)式校驗(yàn)日期格式實(shí)例代碼
如果使用得當(dāng),正則表達(dá)式是匹配各種模式的強(qiáng)大工具,下面這篇文章主要給大家介紹了關(guān)于java正則表達(dá)式校驗(yàn)日期格式的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05

