Springboot 自动配置及starter原理

Spring boot的自动配置是通过启动类上的注解实现的。

老生常谈了,如果看过类似的博文很容易定位。
在这里插入图片描述
Springboot 自动配置及starter原理_第1张图片

Springboot 自动配置及starter原理_第2张图片
Springboot 自动配置及starter原理_第3张图片

小总结

启动类作为配置类会在Springboot启动过程中被ConfigurationClassParser解析,自动配置的实现其实就是通过AutoConfigurationPackage启动类上的两个@Import注解内的类实现

  • AutoConfigurationImportSelector.class
  • AutoConfigurationPackage.Registrar.class

这两个类都是@EnableAutoConfiguration中的,AutoConfigurationPackage主要保存类路径,自动配置的实现主要通过AutoConfigurationImportSelector来实现。

  • ConfigurationClassParser解析配置类——启动类
    • 解析并处理启动类上的@Import注解

对@Import注解不理解时可能会产生疑惑,Spring是如何处理识别并处理@EnableAutoConfiguration,其实并不会去专门识别该注解,在识别@Import注解的过程中会直接到每个注解中去寻找,就会找到@EnableAutoConfiguration中的两个@Import注解
Spring及Springboot配置元数据 @Import

Springboot 自动配置及starter原理_第4张图片

入口:对@Import的解析——将自动配置的实现类AutoConfigurationImportSelector作为DeferredImportSelector收集起来

源码

ConfigurationClassParser解析启动类(配置类)
AutoConfigurationImportSelector
@EnableAutoConfiguration

之后通过对Spring boot启动类的注解解析,其中一个环节的解析就会去解析@Import注解,把这里的AutoConfigurationImportSelector收集起来,AutoConfigurationImportSelector属于DeferredImportSelector,会在ConfigurationClassParser的parse方法之后去解析

DeferredImportSelector

Springboot 自动配置及starter原理_第5张图片

从DeferredImportSelectorHandler对DeferredImportSelector的处理跳转到AutoConfigurationImportSelector的处理

在这里开始自动配置的实现
DeferredImportSelectorHandler

为什么AutoConfigurationImportSelector要作为DeferredImportSelector来延迟加载,这也与自动配置的思想吻合,如果用户自己在解析配置类的过程中没有自己实现,那么就会在延迟加载中通过自动配置来实现加入默认的配置类,也就是使用默认约定。

AutoConfigurationImportSelector最终实现自动配置场景

最终跳到核心场景

AutoConfigurationImportSelector处理自动配置

拓展

starter原理——以mybatis为例

Springboot 自动配置及starter原理_第6张图片
可以看出,starter包引入会包含autoconfigure包,它会封装SPI EnableAutoConfiguration接口的实现类来实现mybatis的自动配置导入。

根据我们上面知道,AutoConfigurationImportSelector可以从类路径中找到这个映射并导入。
Springboot 自动配置及starter原理_第7张图片

druid-spring-boot-starter

原理都一样
Springboot 自动配置及starter原理_第8张图片Springboot 自动配置及starter原理_第9张图片

你可能感兴趣的:(spring,boot,java,spring)