@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public
@interface SpringBootApplication{
}
======================
@SpringBootApplication
public class mainApplication {
public static void main(String[] args) {
SpringApplication.run(mainApplication.class,args);
}
}
1。@SpringBootApplication
mainAPPlication是一个配置类
2.ComponentScan
指定扫描文件,其中有两个自定义扫描器
3.@EnableAutoConfiguration
3.1@AutoConfigurationPackage
自动配置包
@Import(AutoConfigurationPackages.Registrar.class)
registerBeanDefinitions//将指定包下的所有组件导入容器中
位置@SpringBootApplication在mainApplication中所以找的是主程序
3.2@Import(AutoConfigurationImportSelector.class)
利用getAutoConfigurationEntry(annotationMetadata);这个方法给容器中批量导入一些组件{
1.调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)
获取到所有需要导入到容器中的配置类
2.利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);
得到所有的组件
2.1在loadSpringFactories中查找所有的META-INF/spring.factories(文件中是写死给容器的所有配置类)
启动加载所有配置
}
但是会按照按照条件装配规则(@Conditional),最终会按需配置。
SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先
public @interface EnableAutoConfiguration {}
总结:
- SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
- 生效的配置类就会给容器中装配很多组件
- 只要容器中有这些组件,相当于这些功能就有了
- 用户直接自己@Bean替换底层的组件
- 用户去看这个组件是获取的配置文件什么值就去修改。
xxxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties