亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

@Configuration配置處理流程解析

AnnotationConfigApplicationContext基于注解配置

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

ApplicationContext啟動刷新流程

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

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

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

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

ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry,Bean定義后置處理器執(zhí)行入口。
ConfigurationClassPostProcessor#processConfigBeanDefinitions,通過掃描應(yīng)用已注冊配置,引導(dǎo)掃描或?qū)肫渌蜻x配置類。
ConfigurationClassParser#parse,解析每一個配置類,按如下順序處理,具體代碼見:
ConfigurationClassParser#doProcessConfigurationClass
1)、獲取配置類內(nèi)部定義的成員類,即靜態(tài)內(nèi)部類和實例內(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,對于靜態(tài)方法Bean和實例方法Bean定義區(qū)別,需要關(guān)注ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForBeanMethod。

那些年被忽略問題

基于對配置類@Configuration處理流程理解,試下是否能正確回答下面兩個問題:問題 1:@Configuration配置類實例方法聲明@Bean和靜態(tài)方法聲明@Bean有什么區(qū)別,對應(yī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定義,實例方法調(diào)用需要依賴于類實例對象,故會觸發(fā)類實例化,而靜態(tài)方法不需要依賴于實例對象,故不會觸發(fā)類實例化。故如果是類實例方法聲明@Bean,會導(dǎo)致工廠配置類過早實例化,從會引起不可預(yù)期異常。關(guān)于這點,Spring官方明確說明:https://docs.spring.io/spring-framework/reference/core/beans/java/composing-configuration-classes.html

在這里插入圖片描述

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

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

@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,會掃描指定包名下的配置類,按名稱字典序排序。這個會讓內(nèi)部配置類優(yōu)先與配置類處理,bean實例化順序依賴于bean注冊器里面注冊的順序,所以在不存在依賴關(guān)系,即沒有如@Autoware @DependsOn @Lazy等會影響bean實例化順序和Import導(dǎo)入配置類等改變某個配置處理順序前提下,內(nèi)部靜態(tài)配置類定義Bean的實例化會優(yōu)先于外部配置類定義Bean實例化。

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

相關(guān)文章

  • Java實現(xiàn)文件變化監(jiān)聽代碼實例

    Java實現(xiàn)文件變化監(jiān)聽代碼實例

    這篇文章主要介紹了Java實現(xiàn)文件變化監(jiān)聽代碼實例,通過定時任務(wù),輪訓(xùn)查詢文件的最后修改時間,與上一次進行對比,如果發(fā)生變化,則說明文件已經(jīng)修改,進行重新加載或?qū)?yīng)的業(yè)務(wù)邏輯處理,需要的朋友可以參考下
    2024-01-01
  • 關(guān)于Idea中的.properties文件顯示問題

    關(guān)于Idea中的.properties文件顯示問題

    這篇文章主要介紹了關(guān)于Idea中的.properties文件顯示問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • jdk動態(tài)代理源碼分析過程

    jdk動態(tài)代理源碼分析過程

    這篇文章主要介紹了jkd動態(tài)代理源碼分析過程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • springboot Quartz動態(tài)修改cron表達式的方法

    springboot Quartz動態(tài)修改cron表達式的方法

    這篇文章主要介紹了springboot Quartz動態(tài)修改cron表達式的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • SpringBoot使用easy-captcha 實現(xiàn)驗證碼登錄功能(解決思路)

    SpringBoot使用easy-captcha 實現(xiàn)驗證碼登錄功能(解決思路)

    文章介紹了如何使用Spring Boot和Easy-Captcha實現(xiàn)驗證碼登錄功能,后端通過Easy-Captcha生成驗證碼并存儲在Redis中,前端獲取驗證碼并顯示給用戶,登錄時,前端將用戶輸入的驗證碼和標識符發(fā)送到后端進行驗證,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • logback打印多次mybatis的sql日志問題

    logback打印多次mybatis的sql日志問題

    這篇文章主要介紹了logback打印多次mybatis的sql日志問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SpringBoot2整合Ehcache組件實現(xiàn)輕量級緩存管理

    SpringBoot2整合Ehcache組件實現(xiàn)輕量級緩存管理

    EhCache是一個純Java的進程內(nèi)緩存框架,具有快速、上手簡單等特點,是Hibernate中默認的緩存提供方。本文講述下SpringBoot2 整合Ehcache組件的步驟
    2021-06-06
  • IDEA創(chuàng)建SpringBoot的maven項目的方法步驟

    IDEA創(chuàng)建SpringBoot的maven項目的方法步驟

    這篇文章主要介紹了IDEA創(chuàng)建SpringBoot的maven項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • java實現(xiàn)多層級zip解壓的示例代碼

    java實現(xiàn)多層級zip解壓的示例代碼

    這篇文章主要為大家詳細介紹了java實現(xiàn)多層級zip解壓的相關(guān)知識,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-12-12
  • MyBatisPlus 封裝分頁方法示例

    MyBatisPlus 封裝分頁方法示例

    本文主要介紹了基于MybatisPlus的分頁插件封裝,包括分頁結(jié)果對象、查詢對象的封裝,以及對象轉(zhuǎn)換處理,具有一定的參考價值,感興趣的可以了解一下
    2024-12-12

最新評論