SpringBoot自動配置原理

隨著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是需要我們導入了相關的依賴才能成功加載的。

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

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

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