1.自动配置流程
配置流程:
核心注解
2.简单看一下源码
找到springboot项目的启动类,ctrl鼠标左键点击springboot的核心注解 @SpringBootApplication
可以看到 @SpringBootApplication 的底层注解有三个,其他四个是元注解,用来自定义注解的,想了解可以看这篇文章——Java注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
这三个注解,用来进行自动配置的注解是@EnableAutoConfiguration ,其余两个 @SpringBootConfiguration 用来声明这是一个配置类(其底层是 @Configuration),@ComponentScan 指定要扫描哪些包,默认是 启动类同一包及其子包中的组件(就是扫描自己要注册到IOC容器的组件)。
接下来看@EnableAutoConfiguration ,其底层注解有 @AutoConfigurationPackage 和 @Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage 的作用就是就是将 @ComponentScan 扫描到的包注册到IOC容器
所以,真正实现自动配置的还是 @Import(AutoConfigurationImportSelector.class)
进入 AutoConfigurationImportSelector 类,继续追踪,可以追踪到一个类 SpringFactoriesLoader ,这个类的 loadSpringFactories(ClassLoader classLoader) 方法中有如下一段代码:
Enumeration urls = classLoader.getResources("META-INF/spring.factories");
从 META-INF/spring.factories 中加载到文件的,即默认扫描我们当前系统中所有 META-INF/spring.factories 中的文件,这个文件中定义了所有配置类。
这些配置类在启动 main 方法的时候会全部被加载(springboot2.6.7有137个加载的配置文件),但是最终只会按需配置30个左右,这主要是因为 @Conditionalxxx ,这个注解 按照条件配置的规则,很多不满足条件的场景不会被加载。
具体的源码分析可以看这篇文章——springboot依赖管理和自动配置源码分析
|