最近在學習Spring Boot,感覺 Spring 自動配置很神奇,所以着手寫下這篇文章,本文基於Spring Boot 2.0.1 源碼分析自動配置原理。
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 類(類名)對應的值,然后把他們添加在容器中
-
-
-