Java四十四篇:springboot 的自動裝配
程序入口

由springboot的自動配置原理,其入口是@SpringBootApplication注解

SpringBootApplication注解其實是SpringBootConfiguration、EnableAutoConfiguration、ComponentScan三個注解的組合;
SpringBootConfiguration可以理解為Spring版的Configuration注解;
EnableAutoConfiguration:這是SpringBoot自動配置的入口里面有兩個關鍵點

**@AutoConfigurationPackage:**設置SpringBoot自動掃描包點路徑,當basePackages或basePackageClasses屬性沒有指定包掃描路徑時默認從啟動類所在當包開始掃描;
**@Import(AutoConfigurationImportSelector.class:**通過Import注解向Spring容器中注入一個類為AutoConfigurationImportSelector的bean,AutoConfigurationImportSelector實現(xiàn)了DeferredImportSelector類,該類中的getAutoConfigurationEntry方法中會將spring-boot-autoconfigure包下Resource/META-INF/spring.factories文件中以EnableAutoConfiguration為key值的所有配置類讀取并篩選出來,這里面的類都是配置類,和我們自己寫的以@Configuration標注的配置類作用相同,這里面基本包含了目前常用的組件配置。
解釋
1.Springboot啟動后,讀取程序的啟動類時,就會讀取到@SpringBootApplication
2.@SpringBootApplication注解又包含了 @EnableAutoConfiguration注解
3.@EnableAutoConfiguration
注解導入了AutoConfigurationImportSelector類,
4.@AutoConfigurationPackage :自動配置包
5.AutoConfigurationImportSelector.class中,定義了一個方法getCandidateConfigurations,進入getCandidateConfigurations方法,getCandidateConfigurations會到classpath下的讀取META-INF/spring.factories文件的配置
6.spring.factories文件在spring-boot-autoconfigure-2.3.7.RELEASE.jar的META-INF中,spring.factories文件中聲明了很多java配置類,但是每個配置類都是需要滿足一定的條件才會執(zhí)行(例如: @ConditionalOnClass 、 @ConditionalOnProperty、 @ConditionalOnMissingBean等)

7.隨便打開一個自動配置文件,比如說WebMvcAutoConfiguration.class
從WebMvcAutoConfiguration
這個類中使用的注解可以看出,要完成自動配置是有依賴條件的。
這些是springboot特有的,常見的條件依賴注解有:
@ConditionalOnSingleCandidate,僅在當前上下文中存在某個bean時,才會實例化這個Bean。
@ConditionalOnClass,某個class位于類路徑上,才會實例化這個Bean。
@ConditionalOnExpression,當表達式為true的時候,才會實例化這個Bean。
@ConditionalOnMissingBean,僅在當前上下文中不存在某個bean時,才會實例化這個Bean。
@ConditionalOnMissingClass,某個class在類路徑上不存在的時候,才會實例化這個Bean。
@ConditionalOnNotWebApplication,不是web應用時才會實例化這個Bean。
@AutoConfigureAfter,在某個bean完成自動配置后實例化這個bean。
@AutoConfigureBefore,在某個bean完成自動配置前實例化這個bean。
所以,自動配置真正實現(xiàn)是從classpath中搜尋所有的META-INF/spring.factories配置文件 ,并將其中對應的 org.springframework.boot.autoconfigure. 包下的配置項,通過反射實例化為對應標注了 @Configuration的JavaConfig形式的IOC容器配置類 , 然后將這些都匯總成為一個實例并加載到IOC容器中。
總結(jié)
1、@Configuration&與@Bean->基于java代碼的bean配置
2、@Conditional->設置自動配置條件依賴
3、@EnableConfigurationProperties與@ConfigurationProperties->讀取配置文件轉(zhuǎn)換為bean。
4、@EnableAutoConfiguration、@AutoConfigurationPackage 與@Import->實現(xiàn)bean發(fā)現(xiàn)與加載。
5、@EnableAutoConfiguration自動配置從classpath中搜尋所有的META-INF/spring.factories配置文件,并將其中org.springframework.boot.autoconfigure.EnableutoConfiguration對應的配置項通過反射(Java Refletion)實例化為對應的標注了@Configuration的JavaConfig形式的IoC容器配置類,然后匯總為一個并加載到IoC容器。
springboot啟動加載所有的配置類(127個),按需加載所需配置類。
