SpringBoot框架Day03之自动配置源码分析

自动配置源码

@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,进行条件装配。

猜你喜欢

转载自blog.csdn.net/m0_47119598/article/details/113366727