Spring Boot 自動配置原理詳解


最近在學習Spring Boot,感覺 Spring 自動配置很神奇,所以着手寫下這篇文章,本文基於Spring Boot 2.0.1 源碼分析自動配置原理。

一、@SpringBootApplication  主程序入口類注解

 1 @Target(ElementType.TYPE)
 2 @Retention(RetentionPolicy.RUNTIME)
 3 @Documented
 4 @Inherited
 5 @SpringBootConfiguration // 1
 6 @EnableAutoConfiguration // 2
 7 @ComponentScan(excludeFilters = {
 8       @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
 9       @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
10 public @interface SpringBootApplication {}

1、@SpringBootConfiguration  配置類注解

聲明該類是SpringBoot一個配置類,能夠使用Spring標准注解 @Configuration 代替。

2、@EnableAutoConfiguration  自動配置類注解

啟用Spring應用程序上下文的自動配置。通過導入AutoConfigurationImportSelector.class,將類路徑下 META-INF/spring.factories 里面配置的所有 EnableAutoConfiguration 的值加入到了容器中。

1 @Target(ElementType.TYPE)
2 @Retention(RetentionPolicy.RUNTIME)
3 @Documented
4 @Inherited
5 @AutoConfigurationPackage // 1
6 @Import(AutoConfigurationImportSelector.class) // 2
7 public @interface EnableAutoConfiguration {}
    • 1、@AutoConfigurationPackage  自動配置包

   通過導入AutoConfigurationPackages.Registrar.class 類,將主配置類(@SpringBootApplication標注的類)的所在包及下面所有子包里面的所有組件掃描到Spring容器

    • 2、AutoConfigurationImportSelector  關鍵方法 selectImports

   將所有需要導入的組件以全類名的方式返回;這些組件就會被添加到容器中;

 1 @Override
 2 public String[] selectImports(AnnotationMetadata annotationMetadata) {
 3    if (!isEnabled(annotationMetadata)) { // 1
 4       return NO_IMPORTS;
 5    }
 6    AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
 7          .loadMetadata(this.beanClassLoader); // 2
 8    AnnotationAttributes attributes = getAttributes(annotationMetadata); 
 9    List<String> configurations = getCandidateConfigurations(annotationMetadata,
10          attributes);// 3
11    configurations = removeDuplicates(configurations);
12    Set<String> exclusions = getExclusions(annotationMetadata, attributes);
13    checkExcludedClasses(configurations, exclusions);
14    configurations.removeAll(exclusions);
15    configurations = filter(configurations, autoConfigurationMetadata);
16    fireAutoConfigurationImportEvents(configurations, exclusions);
17    return StringUtils.toStringArray(configurations);
18 }
      • 1、判斷是否開啟自動配置,若沒有開啟配置,返回空數組  

      • 2、加載 META-INF/spring-autoconfigure-metadata.properties 中自動配置元數據  

      • 3、獲取候選的配置

        • SpringFactoriesLoader.loadFactoryNames()  

        • 掃描所有jar包類路徑下 META-INF/spring.factories  

        • 把掃描到的這些文件的內容包裝成properties對象  

        • 從properties中獲取到 EnableAutoConfiguration.class 類(類名)對應的值,然后把他們添加在容器中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM