Springboot 自动配置及starter原理

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

老生常谈了,如果看过类似的博文很容易定位。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

小总结

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

  • AutoConfigurationImportSelector.class
  • AutoConfigurationPackage.Registrar.class

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

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

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

在这里插入图片描述

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

源码

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

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

DeferredImportSelector

在这里插入图片描述

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

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

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

AutoConfigurationImportSelector最终实现自动配置场景

最终跳到核心场景

AutoConfigurationImportSelector处理自动配置

拓展

starter原理——以mybatis为例

在这里插入图片描述
可以看出,starter包引入会包含autoconfigure包,它会封装SPI EnableAutoConfiguration接口的实现类来实现mybatis的自动配置导入。

根据我们上面知道,AutoConfigurationImportSelector可以从类路径中找到这个映射并导入。
在这里插入图片描述

druid-spring-boot-starter

原理都一样
在这里插入图片描述在这里插入图片描述


版权声明:本文为qq_44587855原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。