国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

作者丨低調的JVM

來自丨CSDN

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

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

了解Spring內Bean的解析,加載和實例化順序機制有助于我們更好的使用Spring/Springboot,避免手動的去干預Bean的加載過程,搭建更優雅的框架。

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

public abstract class AbstractApplicationContext extends DefaultResourceLoader

implements ConfigurableApplicationContext, DisposableBean {

//刷新Spring容器,相當于初始化

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); //實例化Bean

}

}

}

ApplicationContext內置一個BeanFactory對象,作為實際的Bean工廠,和Bean相關業務都交給BeanFactory去處理。

在BeanFactory實例化所有非延遲加載的單例Bean時,遍歷beanDefinitionNames 集合,按順序實例化指定名稱的Bean。beanDefinitionNames 屬性是Spring在加載Bean Class生成的BeanDefinition時,為這些Bean預先定義好的名稱,看如下代碼:

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory

implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {

public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)

throws BeanDefinitionStoreException {

。。。。。。

this.beanDefinitionNames.add(beanName);

}

}

BeanFactory在加載一個BeanDefinition(也就是加載Bean Class)時,將相應的beanName存入beanDefinitionNames屬性中,在加載完所有的BeanDefinition后,執行Bean實例化工作,此時會依據beanDefinitionNames的順序來有序實例化Bean,也就是說Spring容器內Bean的加載和實例化是有順序的,而且近似一致,當然僅是近似。

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

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

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

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

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

解析內部類,查看內部類是否應該被定義成一個Bean,如果是,遞歸解析。

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

解析配置類上是否有@ComponentScan注解,如果有則執行掃描動作,通過掃描得到的Bean Class會被立即解析成BeanDefinition,添加進beanDefinitionNames屬性中。之后查看掃描到的Bean Class是否是一個配置類(大部分情況是,因為標識@Component注解),如果是則遞歸解析這個Bean Class。

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

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

解析父類上的@ComponentScan,@Import,@Bean,父類不會被再次實例化,因為其子類能夠做父類的工作,不需要額外的Bean了。

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

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

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

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

順序總結:@ComponentScan 》 @Import 》 @Bean

Bean Class的結構圖如上所示,A是配置類的入口,通過A能直接或間接的引入一個模塊。

此時啟動Spring容器,將A引入容器內。

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

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

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

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

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

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

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

當一個Bean A內部通過@Autowired或者@Resource注入Bean B,那么在實例化A時會觸發B的提前實例化,此時會注冊A》B的dependsOn依賴關系,實質和@DependsOn一樣,這個是Spring自動為我們處理好的。

了解Spring Bean的解析,加載及實例化的順序機制能夠加深對Spring的理解,搭建更優雅簡介的Spring框架。

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • spring
    +關注

    關注

    0

    文章

    341

    瀏覽量

    15936

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

文章出處:【微信號:harmonyos_developer,微信公眾號:harmonyos_developer】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    深入解析FSA8049音頻插孔檢測與配置開關

    深入解析FSA8049音頻插孔檢測與配置開關 在音頻設備的設計中,音頻插孔的檢測與配置是一個關鍵環節。今天,我們就來深入了解一下Fairchild(現屬ON Semiconductor
    的頭像 發表于 01-27 15:50 ?836次閱讀

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

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

    奧拓電子數字售解決方案實現全球拓展與規模應用

    隨著人工智能與數字技術深度融入售場景,線下售空間正經歷從“數字展示”到“智能運營”的關鍵演進。奧拓電子錨定“AI+智能視訊”核心戰略,打造全鏈路新
    的頭像 發表于 01-20 11:00 ?561次閱讀

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

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

    PCBA加工件封裝技術解析:從傳統到前沿的全面指南

    的性能、可靠性和小型程度。以下從封裝類型、技術特點、應用場景及發展趨勢四個方面進行系統解析。 ? PCBA加工件封裝技術解析 一、主流封裝技術類型 PCBA
    的頭像 發表于 12-26 09:46 ?350次閱讀

    大模型支撐后勤保障方案生成系統:功能特點與平臺架構解析

    支撐,實現資源高效配置與響應速度提升。以下從支撐作用、系統架構、核心功能及應用場景展開精簡解析: ? ?系統軟件供應可以來這里,這個首肌開始是幺伍扒,中間是幺幺叁叁,最后一個是泗柒泗泗,按照數字順序組合就可以找到。 ?
    的頭像 發表于 12-17 15:49 ?319次閱讀

    圖撲軟件 3D 場景預加載應用實現

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

    Linux內核模塊的加載機制

    ) __versions 內核符號版本校驗數據 __ksymtab導出的符號表 .init.text 初始函數(模塊加載時執行) .exit.text 清理函數(模塊卸載時執行)首先解析ELF頭: 1、提取
    發表于 11-25 06:59

    軟通動力攜手華為云推動制造與售行業數字轉型

    近日,軟通動力攜手華為云在上海共同舉辦“智鏈未來、數創增長——制造與售行業AI應用及數據治理解決方案研討會”。活動聚焦AI大模型構建與數據治理兩大核心議題,深入解析企業智能應用落地的關鍵路徑,為制造與售企業探索數字
    的頭像 發表于 10-27 17:29 ?1330次閱讀

    廣凌智慧教室場景應用:適配多元教學需求的定制配置解析

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

    鴻蒙5開發寶藏案例分享---Web加載時延優化解析

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

    HarmonyOS5云服務技術分享--云函數預加載文章整理

    ??嗨,親愛的開發者朋友們!??? 今天咱們來聊聊如何使用??端云一體方式開發云函數??,尤其針對華為的預加載服務。整個過程會手把手帶你從開始,涵蓋創建工程、編寫代碼、調試到部署,幫你輕松掌握
    發表于 05-22 20:33

    請問CCyUSBDevice如何同時實例2個?

    CYAPI編程手冊中的解釋,CCyUSBDevice實例后是連接到了cyusb driver驅動上,它能查找實例中的多臺USB設備。現在的問題是假如我有2臺cyusb3014設備,固件一樣,系統
    發表于 05-19 07:27

    基于云端虛擬技術云手機解決方案

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

    stm32 DMA串口接收到數組,數組元素順序錯亂怎么解決?

    配置DMA循環模式,使用HAL_UART_Receive_DMA(&huart1,buffer,4)函數將串口數據循環發送到4個元素的buffer數組內,上位機20ms發送一次
    發表于 03-12 08:02