深入剖析Spring boot自動裝配原理三(EnableAutoConfiguration)

概要

何為自動裝配?自動裝配可簡單理解為Spring自動讀取配置類信息,并解析配置類中的Bean信息,然后將相關(guān)Bean初始化到IOC容器中。前面兩個章節(jié)已經(jīng)了解了SPI技術(shù)和Spring中Import注解的實現(xiàn)原理,本章節(jié)來具體講解Spring boot如何使用通過EnableAutoConfiguration注解將Bean自動注入到Spring容器中。

源碼剖析

Spring Boot將相關(guān)配置都集成到了SpringBootApplication注解,在啟動類加上該注解則標(biāo)識為Spring Boot應(yīng)用,進入SpringBootApplication類可以看到該類集成了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三個注解,SpringBootConfiguration繼承了@Configuration,標(biāo)識該類為Spring的配置類,在Spring啟動IOC容器的時候可以識別并解析,ComponentScan表示IOC容器啟動時,需要去掃描注冊的Spring組件,EnableAutoConfiguration即標(biāo)識開啟Spring Boot 自動配置,進入之后發(fā)現(xiàn)其主要包含了兩個注解,一個為AutoConfigurationPackage,另一個為Import,AutoConfigurationPackage默認(rèn)沒有掃描的包路徑暫忽略,Import注解導(dǎo)入了AutoConfigurationImportSelector,該類為Spring Boot自動裝配核心類,通過該類自動裝載了Spring Boot需要的對象到IOC,下面對該類進行重點講解。

首先上源碼

AutoConfigurationImportSelector

由于AutoConfigurationImportSelector實現(xiàn)了DeferredImportSelector(延遲導(dǎo)入)接口,其自動裝配會經(jīng)過ConfigurationClassParser進行后置處理(this.deferredImportSelectorHandler.process(),通過ConfigurationClassParser$DeferredImportSelectorHandler#process方法處理)。

DeferredImportSelector與ImportSelector導(dǎo)入選擇器有所不同,DeferredImportSelector會對導(dǎo)入選擇器進行分組DeferredImportSelector$Group(即不能的選擇器分配到不同的組),然后調(diào)用分組內(nèi)部方法process(DeferredImportSelector$Group#process)解析META-INF/spring.factories路徑所有標(biāo)注key為org.springframework.boot.autoconfigure.EnableAutoConfiguration的配置類,并將其存儲在

autoConfigurationEntries和entries集合中,再通過調(diào)用分組內(nèi)部方法selectImports(DeferredImportSelector$Group#selectImports)返回需要進行自動裝配的配置類實體集合,之后交給ConfigurationClassParser#processImports進行解析。

ImportSelector是直接調(diào)用ImportSelector#selectImports方法,獲取需要自動裝配的配置類classname集合,之后交給ConfigurationClassParser#processImports進行解析。

總結(jié):

Spring Boot自動裝配的流程是先通過SpringApplication將@SpringApplication注解類注入到Spring IOC容器,然后通過ConfigurationClassParser對標(biāo)注@Configuration的類進行解析,當(dāng)解析到@EnableAutoConfiguration注解的時候,發(fā)現(xiàn)其內(nèi)部通過Import注解導(dǎo)入了AutoConfigurationImportSelector類,ConfigurationClassParser通過processImports方法去解析AutoConfigurationImportSelector。AutoConfigurationImportSelector通過selectImports方法運用SPI機制獲取Spring Boot所有jar包內(nèi)META-INF/spring.factories文件內(nèi)路徑標(biāo)注key為org.springframework.boot.autoconfigure.EnableAutoConfiguration的配置類,然后通過一些列的excludeFilter排除相關(guān)配置類,獲取到相關(guān)配置類之后,交由ConfigurationClassParser解析出來,并存入Spring IOC容器對應(yīng)BeanFactory的beanDefinitionMap中,最終通過DefaultListableBeanFactory#preInstantiateSingletons進行實例化,該過程就將Spring Boot的一些Bean自動注入到了Spring IOC容器中。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容