chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

解析加載及實(shí)例化Bean的順序(零配置)

5jek_harmonyos ? 來源:CSDN ? 作者:低調(diào)的JVM ? 2021-08-04 16:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者丨低調(diào)的JVM

來自丨CSDN

https://blog.csdn.net/qq_27529917/article/details/79329809

在使用Spring時(shí),Bean之間會有些依賴,比如一個(gè)Bean A實(shí)例化時(shí)需要用到Bean B,那么B應(yīng)該在A之前實(shí)例化好。很多時(shí)候Spring智能地為我們做好了這些工作,但某些情況下可能不是,比如Springboot的@AutoConfigureAfter注解,手動的指定Bean的實(shí)例化順序。

了解Spring內(nèi)Bean的解析,加載和實(shí)例化順序機(jī)制有助于我們更好的使用Spring/Springboot,避免手動的去干預(yù)Bean的加載過程,搭建更優(yōu)雅的框架。

Spring容器在實(shí)例化時(shí)會加載容器內(nèi)所有非延遲加載的單例類型Bean,看如下源碼:

public abstract class AbstractApplicationContext extends DefaultResourceLoader

implements ConfigurableApplicationContext, DisposableBean {

//刷新Spring容器,相當(dāng)于初始化

public void refresh() throws BeansException, IllegalStateException {

。。。。。。

// Instantiate all remaining (non-lazy-init) singletons.

finishBeanFactoryInitialization(beanFactory);

}

}

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory

implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {

/** List of bean definition names, in registration order */

private volatile List《String》 beanDefinitionNames = new ArrayList《String》(256);

public void preInstantiateSingletons() throws BeansException {

List《String》 beanNames = new ArrayList《String》(this.beanDefinitionNames);

for (String beanName : beanNames) {

。。。。。。

getBean(beanName); //實(shí)例化Bean

}

}

}

ApplicationContext內(nèi)置一個(gè)BeanFactory對象,作為實(shí)際的Bean工廠,和Bean相關(guān)業(yè)務(wù)都交給BeanFactory去處理。

在BeanFactory實(shí)例化所有非延遲加載的單例Bean時(shí),遍歷beanDefinitionNames 集合,按順序?qū)嵗付Q的Bean。beanDefinitionNames 屬性是Spring在加載Bean Class生成的BeanDefinition時(shí),為這些Bean預(yù)先定義好的名稱,看如下代碼:

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory

implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {

public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)

throws BeanDefinitionStoreException {

。。。。。。

this.beanDefinitionNames.add(beanName);

}

}

BeanFactory在加載一個(gè)BeanDefinition(也就是加載Bean Class)時(shí),將相應(yīng)的beanName存入beanDefinitionNames屬性中,在加載完所有的BeanDefinition后,執(zhí)行Bean實(shí)例化工作,此時(shí)會依據(jù)beanDefinitionNames的順序來有序?qū)嵗疊ean,也就是說Spring容器內(nèi)Bean的加載和實(shí)例化是有順序的,而且近似一致,當(dāng)然僅是近似。

Spring在初始化容器時(shí),會先解析和加載所有的Bean Class,如果符合要求則通過Class生成BeanDefinition,存入BeanFactory中,在加載完所有Bean Class后,開始有序的通過BeanDefinition實(shí)例化Bean。

我們先看加載Bean Class過程,零配置下Spring Bean的加載起始于ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry(BeanDefinitionRegistry)方法,我總結(jié)了下其加載解析Bean Class的流程:

配置類可以是Spring容器的起始配置類,也可以是通過@ComponentScan掃描得到的類,也可以是通過@Import引入的類。如果這個(gè)類上含有@Configuration,@Component,@ComponentScan,@Import,@ImportResource注解中的一個(gè),或者內(nèi)部含有@Bean標(biāo)識的方法,那么這個(gè)類就是一個(gè)配置類,Spring就會按照一定流程去解析這個(gè)類上的信息。

在解析的第一步會校驗(yàn)當(dāng)前類是否已經(jīng)被解析過了,如果是,那么需要按照一定的規(guī)則處理(@ComponentScan得到的Bean能覆蓋@Import得到的Bean,@Bean定義的優(yōu)先級最高)。

如果未解析過,那么開始解析:

解析內(nèi)部類,查看內(nèi)部類是否應(yīng)該被定義成一個(gè)Bean,如果是,遞歸解析。

解析@PropertySource,也就是解析被引入的Properties文件。

解析配置類上是否有@ComponentScan注解,如果有則執(zhí)行掃描動作,通過掃描得到的Bean Class會被立即解析成BeanDefinition,添加進(jìn)beanDefinitionNames屬性中。之后查看掃描到的Bean Class是否是一個(gè)配置類(大部分情況是,因?yàn)闃?biāo)識@Component注解),如果是則遞歸解析這個(gè)Bean Class。

解析@Import引入的類,如果這個(gè)類是一個(gè)配置類,則遞歸解析。

解析@Bean標(biāo)識的方法,此種形式定義的Bean Class不會被遞歸解析

解析父類上的@ComponentScan,@Import,@Bean,父類不會被再次實(shí)例化,因?yàn)槠渥宇惸軌蜃龈割惖墓ぷ?,不需要額外的Bean了。

在1,3,4,6中都有遞歸操作,也就是在解析一個(gè)Bean Class A時(shí),發(fā)現(xiàn)其上能夠獲取到其他Bean Class B信息,此時(shí)會遞歸的解析Bean Class B,在解析完Bean Class B后再接著解析Bean Class A,可能在解析B時(shí)能夠獲取到C,那么也會先解析C再解析B,就這樣不斷的遞歸解析。

在第3步中,通過@ComponentScan掃描直接得到的Bean Class會被立即加載入beanDefinitionNames中,但@Import和@Bean形式定義的Bean Class則不會,也就是說正常情況下面@ComponentScan直接得到的Bean其實(shí)例化時(shí)機(jī)比其他兩種形式的要早。

通過@Bean和@Import形式定義的Bean Class不會立即加載,他們會被放入一個(gè)ConfigurationClass類中,然后按照解析的順序有序排列,就是圖片上的 “將配置類有序排列”。一個(gè)ConfigurationClass代表一個(gè)配置類,這個(gè)類可能是被@ComponentScan掃描到的,則此類已經(jīng)被加載過了;也可能是被@Import引入的,則此類還未被加載;此類中可能含有@Bean標(biāo)識的方法。

Spring在解析完了所有Bean Class后,開始加載ConfigurationClass。如果這個(gè)ConfigurationClass是被Import的,也就是說在加載@ComponentScan時(shí)其未被加載,那么此時(shí)加載ConfigurationClass代表的Bean Class。然后加載ConfigurationClass內(nèi)的@Bean方法。

順序總結(jié):@ComponentScan 》 @Import 》 @Bean

Bean Class的結(jié)構(gòu)圖如上所示,A是配置類的入口,通過A能直接或間接的引入一個(gè)模塊。

此時(shí)啟動Spring容器,將A引入容器內(nèi)。

如果A是通過@ComponentScan掃描到的,那么此時(shí)的加載順序是:

A 》 D 》 F 》 B 》 E 》 G 》 C

如果A是通過@Import形式引入的,那么此時(shí)的加載順訊是:

D 》 F 》 B 》 E 》 G 》 A 》 C

當(dāng)然以上僅僅代表著加載Bean Class的順序,實(shí)際實(shí)例化Bean的順序和加載順序大體相同,但還是會有一些差別。

Spring在通過getBean(beanName)形式實(shí)例化Bean時(shí),會通過BeanDefinition去生成Bean對象。在這個(gè)過程中,如果BeanDefinition的DependsOn不為空,從字面理解就是依賴某個(gè)什么,其值一般是某個(gè)或多個(gè)beanName,也就是說依賴于其他Bean。

此時(shí)Spring會將DependsOn指定的這些名稱的Bean先實(shí)例化,也就是先調(diào)用getBean(dependsOn)方法。我們可以通過在Bean Class或者@Bean的方法上標(biāo)識**@DependsOn**注解,來指定當(dāng)前Bean實(shí)例化時(shí)需要觸發(fā)哪些Bean的提前實(shí)例化。

當(dāng)一個(gè)Bean A內(nèi)部通過@Autowired或者@Resource注入Bean B,那么在實(shí)例化A時(shí)會觸發(fā)B的提前實(shí)例化,此時(shí)會注冊A》B的dependsOn依賴關(guān)系,實(shí)質(zhì)和@DependsOn一樣,這個(gè)是Spring自動為我們處理好的。

了解Spring Bean的解析,加載及實(shí)例化的順序機(jī)制能夠加深對Spring的理解,搭建更優(yōu)雅簡介的Spring框架。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    341

    瀏覽量

    16045

原文標(biāo)題:Spring解析,加載及實(shí)例化Bean的順序(零配置)

文章出處:【微信號:harmonyos_developer,微信公眾號:harmonyos_developer】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    i.MX93定制板 – DDR 配置與引導(dǎo)加載程序刷新順序的疑問求解

    的,還是應(yīng)該先刷新引導(dǎo)加載程序? - 如果 DDR 配置確實(shí)是第一步,為什么配置工具驗(yàn)證在我們的自定義板上會失敗,而在 EVK 上工作正常? 有關(guān)此 USB 通信問題的正確啟動順序和潛
    發(fā)表于 04-16 06:27

    IDT72T6480:2.5V 順序流控制設(shè)備的深度解析

    IDT72T6480:2.5V 順序流控制設(shè)備的深度解析 在電子設(shè)計(jì)領(lǐng)域,高效的數(shù)據(jù)存儲與處理一直是工程師們追求的目標(biāo)。IDT72T6480 這款 2.5V 順序流控制設(shè)備,憑借其獨(dú)特的特性和廣泛
    的頭像 發(fā)表于 04-12 12:40 ?451次閱讀

    ELF-RV112B RKNN模型加載與運(yùn)行時(shí)初始

    ELF-RV112B RKNN模型加載與運(yùn)行時(shí)初始
    的頭像 發(fā)表于 04-03 16:08 ?142次閱讀
    ELF-RV112B RKNN模型<b class='flag-5'>加載</b>與運(yùn)行時(shí)初始<b class='flag-5'>化</b>

    碳園區(qū)數(shù)字平臺賦能型模式的適用場景解析

    碳園區(qū)數(shù)字平臺賦能型模式,核心是依托能碳一體數(shù)字平臺,打通“源-網(wǎng)-荷-儲-碳”全鏈路數(shù)據(jù)壁壘,通過智能感知、建模分析、動態(tài)調(diào)控與協(xié)同管理,為園區(qū)碳轉(zhuǎn)型提供精準(zhǔn)
    的頭像 發(fā)表于 03-27 11:44 ?163次閱讀
    <b class='flag-5'>零</b>碳園區(qū)數(shù)字<b class='flag-5'>化</b>平臺賦能型模式的適用場景<b class='flag-5'>解析</b>

    電磁兼容仿真模擬系統(tǒng)平臺:全景解析與應(yīng)用實(shí)例

    電磁兼容仿真模擬系統(tǒng)平臺:全景解析與應(yīng)用實(shí)例
    的頭像 發(fā)表于 03-10 10:39 ?420次閱讀
    電磁兼容仿真模擬系統(tǒng)平臺:全景<b class='flag-5'>解析</b>與應(yīng)用<b class='flag-5'>實(shí)例</b>

    掌握 LuatIO:GPIO 復(fù)用模式初始配置全流程解析

    在使用 LuatIO 進(jìn)行嵌入式應(yīng)用開發(fā)時(shí),合理配置 GPIO 的復(fù)用功能是實(shí)現(xiàn)外設(shè)控制的前提。本文全面解析 GPIO 引腳由普通 IO 轉(zhuǎn)換為復(fù)用功能引腳的初始流程,包括時(shí)鐘使能、模式選擇、速度
    的頭像 發(fā)表于 01-23 15:28 ?2262次閱讀
    掌握 LuatIO:GPIO 復(fù)用模式初始<b class='flag-5'>化</b><b class='flag-5'>配置</b>全流程<b class='flag-5'>解析</b>

    深入解析ADA4255:漂移、高壓可編程增益儀表放大器

    深入解析ADA4255:漂移、高壓可編程增益儀表放大器 在工業(yè)和數(shù)據(jù)采集領(lǐng)域,對高精度、高性能儀表放大器的需求日益增長。ADA4255作為一款漂移、高壓可編程增益儀表放大器,憑借其豐富的特性
    的頭像 發(fā)表于 01-15 17:30 ?761次閱讀

    PCBA加工件封裝技術(shù)解析:從傳統(tǒng)到前沿的全面指南

    的性能、可靠性和小型程度。以下從封裝類型、技術(shù)特點(diǎn)、應(yīng)用場景及發(fā)展趨勢四個(gè)方面進(jìn)行系統(tǒng)解析。 ? PCBA加工件封裝技術(shù)解析 一、主流封裝技術(shù)類型 PCBA
    的頭像 發(fā)表于 12-26 09:46 ?559次閱讀

    圖撲軟件 3D 場景預(yù)加載應(yīng)用實(shí)現(xiàn)

    預(yù)加載是在進(jìn)入正式場景之前提前加載所需模型、材質(zhì)、圖片等資源的技術(shù)手段,其核心價(jià)值在于消除資源加載等待,確保場景首次渲染即可完整呈現(xiàn),從而提供無縫、流暢的用戶體驗(yàn)。在復(fù)雜的 Web 3D 可視
    的頭像 發(fā)表于 12-01 16:04 ?923次閱讀
    圖撲軟件 3D 場景預(yù)<b class='flag-5'>加載</b>應(yīng)用實(shí)現(xiàn)

    Linux內(nèi)核模塊的加載機(jī)制

    ) __versions 內(nèi)核符號版本校驗(yàn)數(shù)據(jù) __ksymtab導(dǎo)出的符號表 .init.text 初始函數(shù)(模塊加載時(shí)執(zhí)行) .exit.text 清理函數(shù)(模塊卸載時(shí)執(zhí)行)首先解析ELF頭: 1、提取
    發(fā)表于 11-25 06:59

    軟通動力攜手華為云推動制造與售行業(yè)數(shù)字轉(zhuǎn)型

    近日,軟通動力攜手華為云在上海共同舉辦“智鏈未來、數(shù)創(chuàng)增長——制造與售行業(yè)AI應(yīng)用及數(shù)據(jù)治理解決方案研討會”?;顒泳劢笰I大模型構(gòu)建與數(shù)據(jù)治理兩大核心議題,深入解析企業(yè)智能應(yīng)用落地的關(guān)鍵路徑,為制造與售企業(yè)探索數(shù)字
    的頭像 發(fā)表于 10-27 17:29 ?1468次閱讀

    廣凌智慧教室場景應(yīng)用:適配多元教學(xué)需求的定制配置解析

    在教育信息2.0時(shí)代,智慧教室的建設(shè)已從單一功能升級轉(zhuǎn)向場景、個(gè)性、生態(tài)的深度融合。廣凌科技基于多年技術(shù)積累與實(shí)踐驗(yàn)證,提出覆蓋“常態(tài)
    的頭像 發(fā)表于 07-18 10:00 ?639次閱讀
    廣凌智慧教室場景應(yīng)用:適配多元教學(xué)需求的定制<b class='flag-5'>化</b><b class='flag-5'>配置</b><b class='flag-5'>解析</b>

    鴻蒙5開發(fā)寶藏案例分享---Web加載時(shí)延優(yōu)化解析

    : Network泳道 :查看資源加載時(shí)序 Main泳道 :監(jiān)控JS/CSS解析阻塞 Performance面板 :定位長任務(wù)(Long Tasks) ??** 四大優(yōu)化方向 + 代碼實(shí)戰(zhàn)** 以下
    發(fā)表于 06-12 17:11

    請問CCyUSBDevice如何同時(shí)實(shí)例2個(gè)?

    CYAPI編程手冊中的解釋,CCyUSBDevice實(shí)例后是連接到了cyusb driver驅(qū)動上,它能查找實(shí)例中的多臺USB設(shè)備?,F(xiàn)在的問題是假如我有2臺cyusb3014設(shè)備,固件一樣,系統(tǒng)
    發(fā)表于 05-19 07:27

    基于云端虛擬技術(shù)云手機(jī)解決方案

    云手機(jī)解決方案基于云端虛擬技術(shù),通過整合軟硬件資源實(shí)現(xiàn)多設(shè)備集群化管理與智能操作,以下是針對不同應(yīng)用場景的核心要素與技術(shù)架構(gòu)解析: 一、核心技術(shù)架構(gòu)? 虛擬引擎? 基于ARM/X
    的頭像 發(fā)表于 05-09 08:04 ?968次閱讀
    基于云端虛擬<b class='flag-5'>化</b>技術(shù)云手機(jī)解決方案