SpringBoot框架Day03之自動配置原始碼分析
阿新 • • 發佈:2021-01-30
技術標籤:springbootspring bootspringjavamybatis
自動配置原始碼
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter. class}
)}
)
public @interface SpringBootApplication {
- @SpringBootConfiguration 點進後也是@Configuration。證明:MainApplication也是一個配置類(主程式)(次)
- @ComponentScan指定掃描內容(次)
- @EnableAutoConfiguration(主)
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
中的核心註解①:
@AutoConfigurationPackage點進發現此註解上宣告@Import({Registrar.class})
// 利用Registar給容器中匯入一系列元件
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
// 呼叫register(),將主執行程式MainApplication所對應包的此包下所有元件匯入
register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
}
@Override
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImports(metadata));
}
}
中的核心註解②@Import({AutoConfigurationImportSelector.class})
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
// 給容器批量匯入一些元件,點進getAutoConfigurationEntry()
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
}
AnnotationAttributes attributes = getAttributes(annotationMetadata);
// 獲取所有候選配置,獲取所有需要匯入到容器的配置類
// 載入所有元件儲存在Map中,private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
// loadSpringFactories()從META-INF/spring.factories位置載入一個檔案,系統掃描所有META-INF/spring.factories位置檔案,為了去掃描spring-boot-autoconfigure-2.3.4.RELEASE.jar下的spring.factories檔案內部的127條# Auto Configure(springboot啟動時載入的所有配置類)
// org.springframework.boot.autoconfigure.*,共127個配置類將會 按需開啟。
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
configurations = removeDuplicates(configurations);
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = getConfigurationClassFilter().filter(configurations);
fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationEntry(configurations, exclusions);
}
按需開啟127個自動配置項
得益於springboot按需載入註解@Conditional,進行條件裝配。