最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring關(guān)于@Configuration配置處理流程

 更新時(shí)間:2023年06月25日 15:44:14   作者:軟件開發(fā)隨心記  
這篇文章主要介紹了Spring關(guān)于@Configuration配置處理流程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

@Configuration配置處理流程解析

AnnotationConfigApplicationContext基于注解配置

Spring通過上下文應(yīng)用AnnotationConfigApplicationContext提供基于注解配置能力,啟動(dòng)過程中通過ConfigurationClassPostProcessor在執(zhí)行Bean定義注冊(cè)后處理器階段解析@Configuration、@Bean、@Import等注解,完成Bean聲明定義和注冊(cè)到容器注冊(cè)器中。本文簡(jiǎn)述Spring容器啟動(dòng)流程對(duì)配置類@Configuration處理過程,理解Spring應(yīng)用如何實(shí)現(xiàn)基于@Configuration配置注冊(cè)。

ApplicationContext啟動(dòng)刷新流程

Spring容器啟動(dòng)流程AbstractApplicationContext#refresh,列舉幾個(gè)關(guān)鍵階段(感興趣同學(xué)自行debug):

  • obtainFreshBeanFactory,獲取Bean工廠。
  • prepareBeanFactory,準(zhǔn)備工作,設(shè)置系統(tǒng)相關(guān)Bean定義等。
  • postProcessBeanFactory,設(shè)置Bean工廠后處理。
  • invokeBeanFactoryPostProcessors,執(zhí)行Bean工廠后置處理器,按Bean定義注冊(cè)器后處理,Bean工廠后置處理順序執(zhí)行。
  • registerBeanPostProcessors,注冊(cè)Bean后處理器。
  • initMessageSource、initApplicationEventMulticaster,初始化國(guó)際化消息和Spring事件廣播處理器。
  • registerListeners,注冊(cè)監(jiān)聽器。
  • finishBeanFactoryInitialization,固化配置,完成單例非延遲初始化對(duì)象實(shí)例化。

Spring關(guān)于@Configuration解析處理流程

上面第4點(diǎn),Spring可以通過自定義Bean定義后置處理,自定義解析Bean定義規(guī)則并完成Bean定義注冊(cè)到Spring容器中,@Configuration就是通過bean定義注冊(cè)后置處理器ConfigurationClassPostProcessor實(shí)現(xiàn),關(guān)鍵處理步驟如下(感興趣同學(xué)自行debug):

ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry,Bean定義后置處理器執(zhí)行入口。
ConfigurationClassPostProcessor#processConfigBeanDefinitions,通過掃描應(yīng)用已注冊(cè)配置,引導(dǎo)掃描或?qū)肫渌蜻x配置類。
ConfigurationClassParser#parse,解析每一個(gè)配置類,按如下順序處理,具體代碼見:
ConfigurationClassParser#doProcessConfigurationClass
1)、獲取配置類內(nèi)部定義的成員類,即靜態(tài)內(nèi)部類和實(shí)例內(nèi)部類,如果內(nèi)部成員類為配置類,則遞歸處理內(nèi)部成員類。
2)、處理配置類上面@PropertySource注解,屬性文件注入處理。
3)、掃描@ComponentScan @ComponentScans指定路徑下Component類(ComponentScanAnnotationParser#parse),如果掃描類為配置類,則遞歸處理掃描到的類。
4)、處理@Import,導(dǎo)入指定配置類,導(dǎo)入方式分ImportSelector,ImportBeanDefinitionRegistrar和processConfigurationClass。
5)、處理@ImportResource,導(dǎo)入指定配置資源文件。
6)、處理配置類內(nèi)部定義的@Bean methods
7)、處理default methods on interfaces
8)、處理superClass
ConfigurationClassBeanDefinitionReader#loadBeanDefinitions,加載3解析出來@Bean,對(duì)于靜態(tài)方法Bean和實(shí)例方法Bean定義區(qū)別,需要關(guān)注ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForBeanMethod。

那些年被忽略問題

基于對(duì)配置類@Configuration處理流程理解,試下是否能正確回答下面兩個(gè)問題:?jiǎn)栴} 1:@Configuration配置類實(shí)例方法聲明@Bean和靜態(tài)方法聲明@Bean有什么區(qū)別,對(duì)應(yīng)用啟動(dòng)有產(chǎn)生什么影響?樣例代碼如下:

@Configuration
public class UserConfiguration {
	@Bean
	public static UserService userService() {
		return new UserService();
	}
	/*@Bean
	public UserService userService() {
		return new UserService();
	}*/
}
@Data
public class UserService {
	public String sayHello() {
		return "hello";
	}
}

解析 1:從@Configuration解析處理流程可以知道,@Bean方法在ConfigurationClassBeanDefinitionReader#loadBeanDefinitions中通過包裝成工廠方法去聲明Bean定義,實(shí)例方法調(diào)用需要依賴于類實(shí)例對(duì)象,故會(huì)觸發(fā)類實(shí)例化,而靜態(tài)方法不需要依賴于實(shí)例對(duì)象,故不會(huì)觸發(fā)類實(shí)例化。故如果是類實(shí)例方法聲明@Bean,會(huì)導(dǎo)致工廠配置類過早實(shí)例化,從會(huì)引起不可預(yù)期異常。關(guān)于這點(diǎn),Spring官方明確說明:https://docs.spring.io/spring-framework/reference/core/beans/java/composing-configuration-classes.html

在這里插入圖片描述

  • @Configuration配置類依賴應(yīng)該簡(jiǎn)單,因?yàn)榕渲妙悓?shí)例化可能會(huì)提前,依賴注入關(guān)系會(huì)導(dǎo)致非預(yù)期異常。
  • @Configuration如果有定義bean工廠后處理器和bean后處理器,應(yīng)該聲明為靜態(tài)@Bean方法,避免導(dǎo)致配置類過早實(shí)例化。

問題 2: @Configuration配置類內(nèi)部實(shí)例類和內(nèi)部靜態(tài)類內(nèi)聲明Bean,Bean實(shí)例化順序是什么?樣例代碼如下:

@Configuration
public class UserOuterConfiguration {
	@Bean
	public UserService userService1() {
		return new UserService("userService1");
	}
	@Configuration
	public static class UserInnerConfiguration {
		@Bean
		public UserService userService2() {
			return new UserService("userService2");
		}
	}
}
@Data
@AllArgsConstructor
public static class UserService {
	private String name;
	public String sayHello() {
		return "hello";
	}
}

解析2:在組件掃描ComponentScan處理候選Configuration,會(huì)掃描指定包名下的配置類,按名稱字典序排序。這個(gè)會(huì)讓內(nèi)部配置類優(yōu)先與配置類處理,bean實(shí)例化順序依賴于bean注冊(cè)器里面注冊(cè)的順序,所以在不存在依賴關(guān)系,即沒有如@Autoware @DependsOn @Lazy等會(huì)影響bean實(shí)例化順序和Import導(dǎo)入配置類等改變某個(gè)配置處理順序前提下,內(nèi)部靜態(tài)配置類定義Bean的實(shí)例化會(huì)優(yōu)先于外部配置類定義Bean實(shí)例化。

到此這篇關(guān)于Spring關(guān)于@Configuration配置處理流程解析的文章就介紹到這了,更多相關(guān)Spring @Configuration配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解讀Spring MVC的工作流程

    解讀Spring MVC的工作流程

    SpringMVC的工作流程是基于模型-視圖-控制器(MVC)設(shè)計(jì)模式的一個(gè)典型實(shí)現(xiàn),主要包括用戶發(fā)送請(qǐng)求到前端控制器(DispatcherServlet)、前端控制器轉(zhuǎn)發(fā)請(qǐng)求給處理器映射器(HandlerMapping)
    2025-01-01
  • Google Guava 緩存工具使用詳解

    Google Guava 緩存工具使用詳解

    這篇文章主要介紹了Guava自加載緩存LoadingCache使用指南,通過這些內(nèi)容介紹,了解了LoadingCache的基本原理和用法,包括如何創(chuàng)建和配置緩存,以及如何結(jié)合Java?8的特性來優(yōu)化代碼,需要的朋友可以參考下
    2023-12-12
  • Java中的CompletableFuture原理與用法

    Java中的CompletableFuture原理與用法

    CompletableFuture 是由Java8引入的,這讓我們編寫清晰可讀的異步代碼變得更加容易,該類功能比Future 更加強(qiáng)大,在Java中CompletableFuture用于異步編程,異步通常意味著非阻塞,運(yùn)行任務(wù)單獨(dú)的線程,與主線程隔離,這篇文章介紹CompletableFuture原理與用法,一起看看吧
    2024-01-01
  • 詳解Java分布式事務(wù)的 6 種解決方案

    詳解Java分布式事務(wù)的 6 種解決方案

    在分布式系統(tǒng)、微服務(wù)架構(gòu)大行其道的今天,服務(wù)間互相調(diào)用出現(xiàn)失敗已經(jīng)成為常態(tài),本文側(cè)重于其他幾項(xiàng),關(guān)于 2PC、3PC 傳統(tǒng)事務(wù),網(wǎng)上資料已經(jīng)非常多了,這里不多做重復(fù),本文通過示例給大家介紹Java分布式事務(wù)的 6 種解決方案,一起看看吧
    2021-06-06
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(25)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(25)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Springboot實(shí)現(xiàn)多線程及線程池監(jiān)控

    Springboot實(shí)現(xiàn)多線程及線程池監(jiān)控

    線程池的監(jiān)控很重要,本文就來介紹一下Springboot實(shí)現(xiàn)多線程及線程池監(jiān)控,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Mybatis空值關(guān)聯(lián)的具體實(shí)現(xiàn)

    Mybatis空值關(guān)聯(lián)的具體實(shí)現(xiàn)

    在復(fù)雜的數(shù)據(jù)庫(kù)查詢中,處理空值關(guān)聯(lián)是一項(xiàng)常見的需求,本文就來介紹一下Mybatis空值關(guān)聯(lián)的具體實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 將字符串?dāng)?shù)字格式化為樣式1,000,000,000的方法

    將字符串?dāng)?shù)字格式化為樣式1,000,000,000的方法

    這篇文章主要介紹了將字符串?dāng)?shù)字格式化為樣式1,000,000,000的方法,有需要的朋友可以參考一下
    2014-01-01
  • 三分鐘帶你了解SpringBoot真正的啟動(dòng)引導(dǎo)類

    三分鐘帶你了解SpringBoot真正的啟動(dòng)引導(dǎo)類

    這篇文章主要介紹了三分鐘帶你了解SpringBoot真正的啟動(dòng)引導(dǎo)類,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java將本地項(xiàng)目部署到Linux服務(wù)器的實(shí)踐

    Java將本地項(xiàng)目部署到Linux服務(wù)器的實(shí)踐

    本文主要介紹了Java將本地項(xiàng)目部署到Linux服務(wù)器的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-06-06

最新評(píng)論

武夷山市| 兴宁市| 巫山县| 莱州市| 吉隆县| 庐江县| 金坛市| 大宁县| 彭阳县| 锡林浩特市| 安泽县| 天水市| 营口市| 毕节市| 那坡县| 卫辉市| 玉田县| 襄樊市| 渭源县| 贵州省| 长海县| 织金县| 泰安市| 金塔县| 柘城县| 崇文区| 乐山市| 栾城县| 独山县| 金华市| 游戏| 芦溪县| 鹤庆县| 洛阳市| 汉阴县| 上犹县| 公主岭市| 拉孜县| 牡丹江市| 南昌县| 汶上县|