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