隨著SpringBoot的大規(guī)模使用,我們有必要來了解一下SpringBoot底層是如何為我們進(jìn)行一系列配置的
這是一個SpringBoot的啟動類,運(yùn)行該類就能啟動我們的SpringBoot服務(wù)
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
我們查看一下這個啟動類上的@SpringBootApplication這個注解乎莉,這個注解實(shí)際上是一個復(fù)合注解易遣,我們點(diǎn)進(jìn)去可以看到這個注解還包含了其他的幾個注解扔仓,@SpringBootConfiguration、@EnabLeAutoConfiguration仰挣、@componentscan
@SpringBootConfiguration和@componentscan
@SpringBootConfiguration注解就是一個@Configuration,代表當(dāng)前是一個配置類缠沈,而@componentscan的含義是指定掃描那些位置膘壶,自動配置的關(guān)鍵在于第三個注解@EnabLeAutoConfiguration (開啟自動配置)
@EnabLeAutoConfiguration
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
這個注解也是一個復(fù)合注解,里面包含了@AutoConfigurationPackage(自動配置包)博烂,同時這個自動配置包的注解里面又包含一個@Import(AutoConfigurationPackages.Registrar.class)香椎,這個注解的意思是給容器中導(dǎo)入一個Registrar組件
@AutoConfigurationPackage
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)//給容器中導(dǎo)入一個組件
public @interface AutoConfigurationPackage {
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
}
Registrar
Registrar中有兩個方法,參數(shù)為AnnotationMetadata,這個參數(shù)中記錄了當(dāng)前注解標(biāo)注的類的信息禽篱,包括類的位置畜伐,包路徑之類的信息,利用Registrar給容器中批量的添加組件躺率,添加的范圍是@EnabLeAutoConfiguration這個注解標(biāo)注的類的所在包玛界,也就是我們springBoot的啟動類所在的包,這樣就解釋了為什么我們經(jīng)常說啟動類包下的所有資源都會加載之類的
@Import(AutoConfigurationImportSelector.class)
接下來說說@EnabLeAutoConfiguration的最后一個注解悼吱,用getAutoConfigurationEntry(annotationMetadata);給容器中批量導(dǎo)入一些組件慎框,調(diào)用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)獲取到所有需要導(dǎo)入到容器中的配置類,利用工廠加載 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的組件后添,從META-INF/spring.factories位置來加載一個文件笨枯。默認(rèn)掃描我們當(dāng)前系統(tǒng)里面所有META-INF/spring.factories位置的文件, spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories
總結(jié)
SpringBoot的自動配置關(guān)鍵的注解是@EnabLeAutoConfiguration遇西,這個注解里面包含了包掃描規(guī)則以及spring-boot-autoconfigure-2.3.4.RELEASE.jar包中有META-INF/spring.factories路徑下配置寫死的需要配置的文件信息馅精,雖然里面的所有都會被加載,但是實(shí)際上還是遵循的按需加載原則粱檀,因?yàn)槔锩婧芏鄕xxxAutoConfiguration是需要我們導(dǎo)入了相關(guān)的依賴才能成功加載的洲敢。