zl程序教程

您现在的位置是:首页 >  后端

当前栏目

2分钟明白springboot自动配置流程

2023-09-11 14:22:32 时间

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依赖管理和自动配置源码分析