日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring ConfigurationClassPostProcessor Bean解析及自注册过程

發布時間:2023/12/10 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring ConfigurationClassPostProcessor Bean解析及自注册过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一bean的自注冊過程

二,自注冊過程說明

1 configurationclassparser解析流程
1、處理@PropertySources注解,配置信息的解析
2、處理@ComponentScan注解:使用ComponentScanAnnotationParser掃描basePackage下的需要解析的類(@SpringBootApplication注解也包括了@ComponentScan注解,只不過basePackages是空的,空的話會去獲取當前@Configuration修飾的類所在的包[這個會在下面詳細解釋]),并注冊到BeanFactory中(這個時候bean并沒有進行實例化,而是進行了注冊。具體的實例化在finishBeanFactoryInitialization方法中執行)。對于掃描出來的類,遞歸解析
3、處理@Import注解:先遞歸找出所有的注解,然后再過濾出只有@Import注解的類,得到@Import注解的值。比如查找@SpringBootApplication注解的@Import注解數據的話,首先發現@SpringBootApplication不是一個@Import注解,然后遞歸調用修飾了@SpringBootApplication的注解,發現有個@EnableAutoConfiguration注解,再次遞歸發現被@Import(EnableAutoConfigurationImportSelector.class)修飾,還有@AutoConfigurationPackage注解修飾,再次遞歸@AutoConfigurationPackage注解,發現被@Import(AutoConfigurationPackages.Registrar.class)注解修飾,所以@SpringBootApplication注解對應的@Import注解有2個,分別是@Import(AutoConfigurationPackages.Registrar.class)和@Import(EnableAutoConfigurationImportSelector.class)。找出所有的@Import注解之后,開始處理邏輯:

(1)、遍歷這些@Import注解內部的屬性類集合

(2)、如果這個類是個ImportSelector接口的實現類,實例化這個ImportSelector,如果這個類也是DeferredImportSelector接口的實現類,那么加入ConfigurationClassParser的deferredImportSelectors屬性中讓第6步處理。否則調用ImportSelector的selectImports方法得到需要Import的類,然后對這些類遞歸做@Import注解的處理

(3)、如果這個類是ImportBeanDefinitionRegistrar接口的實現類,設置到配置類ConfigurationClass的importBeanDefinitionRegistrars屬性中

(4)、其它情況下把這個類入隊到ConfigurationClassParser的importStack(隊列)屬性中,然后把這個類當成是@Configuration注解修飾的類遞歸重頭開始解析這個類

4、處理@ImportResource注解:獲取@ImportResource注解的locations屬性,得到資源文件的地址信息。然后遍歷這些資源文件并把它們添加到配置類的importedResources屬性中

5、處理@Bean注解:獲取被@Bean注解修飾的方法,然后添加到配置類的beanMethods屬性中

6、處理DeferredImportSelector:處理第3步@Import注解產生的DeferredImportSelector,進行selectImports方法的調用找出需要import的類,然后再調用第3步相同的處理邏輯處理

2 springbootapplication注解

@SpringBootApplication注解被@EnableAutoConfiguration修飾,@EnableAutoConfiguration注解被@Import(EnableAutoConfigurationImportSelector.class)修飾,所以在第3步會找出這個@Import修飾的類EnableAutoConfigurationImportSelector,這個類剛好實現了DeferredImportSelector接口,接著就會在第6步被執行。第6步selectImport得到的類就是自動化配置類。

EnableAutoConfigurationImportSelector的selectImport方法會在spring.factories文件中找出key為EnableAutoConfiguration對應的值【這些值就是所謂的自動化配置類(XXXAutoConfiguration)】。

ConfigurationClassParser解析完成之后,被解析出來的類會放到configurationClasses屬性中。然后使用ConfigurationClassBeanDefinitionReader去解析這些類。

三 componentscanannotationparaser包掃描相關

首先啟動一個springboot web工程,找到ApplicationContext的父類org.springframework.context.support.AbstractApplicationContext

 我們發現,其真實的對象的類型是AnnotationConfigEmbeddedWebApplicationContext。 自身構造過程如下。
 
 繼續追蹤AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry)
 
 
  終于找到了ConfigurationClassPostProcessor自注冊后置處理器。這里有個有趣的ConfigurationClassPostProcessor解析流程, 內部調用中會使用 ComponentScanAnnotationParser去掃描,ComponentScanAnnotationParser類的parse方法有這樣一段邏輯

if (basePackages.isEmpty()) {basePackages.add(ClassUtils.getPackageName(declaringClass)); }

參考下面的相關圖:

也就是如果basePackages沒有配置,會找declaringClass 對應包及其子包,declaringClass對應springboot項目中我們寫的Application.java(@SpringBootApplication)
 
 
 
 
3 調用棧
 
2 實際項目結構
 
  包結構這樣的話,即使不配置componentScan,不使用AutoConfiguration,也可以掃描到bean。Application.java帶有@SpringbootApplication注解,該注解中帶有@ComponentScan注解,Application.java包的范圍包含了所有java文件,所以項目中所有bean都可以被掃描到。

注:declaringClass 指的是帶有@ComponentScan 注解的類

總結

以上是生活随笔為你收集整理的Spring ConfigurationClassPostProcessor Bean解析及自注册过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。