springboot自动配置
1. SpringBoot自动配置

@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}), @Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class})}
)
public @interface SpringBootApplication{}
1.1 @SpringBootConfiguration
@Configuration
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
@Configuration:代表当前是一个配置类
1.2 @EnableAutoConfiguration
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
1.2.1 @AutoConfigurationPackage
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
}
@AutoConfigurationPackage:自动配置包
@Import:给容器中导入一个组件(Registrar.class),利用Registrar给容器中导入一系列组件;
registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry)方法中metadata代表注解的元信息,我们这个这个注解是@AutoConfigurationPackage;registerBeanDefinitions方法体的内部有一行代码getPackageNames()代表获取元注解的包信息,所以我们拿到的包信息就是Springboot的main方法的包路径;
public class AutoConfigurationPackages{
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
Registrar() {
}
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new AutoConfigurationPackages.PackageImports(metadata));
}
}
}
所以,@Import 注解最终实现的结果就是将启动类路径下的包和子包,全部扫描进容器中;(全部扫描不意味着全部加载,能够被加载需要满足加载所需的条件)
springboot的自动配置是什么,有什么作用?

浙公网安备 33010602011771号