1. 程式人生 > 其它 >SpringBoot框架Day03之自動配置原始碼分析

SpringBoot框架Day03之自動配置原始碼分析

技術標籤:springbootspring bootspringjavamybatis

自動配置原始碼

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.
class} )} ) public @interface SpringBootApplication {
  1. @SpringBootConfiguration 點進後也是@Configuration。證明:MainApplication也是一個配置類(主程式)(次)
  2. @ComponentScan指定掃描內容(次)
  3. @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,進行條件裝配。