Springboot的习惯优于配置,其实就是默认装配一些配置,。对于整体的开发、部署提升了效率。我们直接写一个main类就可以快速开发了。
比如我们引入web的starter-web,那么就引入了web的框架。
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.1.RELEASE</version>
        </dependency>
SpringBootApplication
@SpringBootApplication
public class ApplicationContext {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationContext.class,args);
    }
}
SpringbootApplication是有多个注解组合的功能
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}
SpringBootConfiguration
SpringBootConfiguration其实就是标识是一个配置类,最终会注册到spring容器中
@Configuration
public @interface SpringBootConfiguration {
}
EnableAutoConfiguration
开启自动配置功能,spring需要手动配置的信息,boot自动完成。@EnableAutoConfiguration通知SpringBoot开启自动配置功能,这样自动配置才能生效
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
AutoConfigurationPackage的功能是自动配置包,包的基础路径等
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}
自动将主类所在的包及其子包里的组建扫描到spring容器中。
	static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
		@Override
		public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
			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)
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
		return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
	}
private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
		MultiValueMap<String, String> result = cache.get(classLoader);
		if (result != null) {
			return result;
		}
		try {
		    //从META-INF/spring.factories 路径下读取
			Enumeration<URL> urls = (classLoader != null ?
					classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
					ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
			result = new LinkedMultiValueMap<>();
			while (urls.hasMoreElements()) {
				URL url = urls.nextElement();
				UrlResource resource = new UrlResource(url);
				Properties properties = PropertiesLoaderUtils.loadProperties(resource);
				for (Map.Entry<?, ?> entry : properties.entrySet()) {
					String factoryTypeName = ((String) entry.getKey()).trim();
					for (String factoryImplementationName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) {
						result.add(factoryTypeName, factoryImplementationName.trim());
					}
				}
			}
			cache.put(classLoader, result);
			return result;
		}
		catch (IOException ex) {
			throw new IllegalArgumentException("Unable to load factories from location [" +
					FACTORIES_RESOURCE_LOCATION + "]", ex);
		}
	}

 将默认的自动配置类导入到容器中,自动配置类就会生效。
 



















