SpringBoot——SpringBoot自动配置原理(2.2.5版本)

SpringBoot 自动配置原理

​ 作为 SpringBoot 的精髓,自动配置是“习惯优于配置”理念的体现,了解 SpringBoot 自动配置的原理也是学习 SpringBoot 过程中不可绕开的重要内容

从启动类开始说起

​ 要了解自动配置原理,我们首先要找到自动配置的入口,或者说是开关,学习过 SpringBoot 的同学都知道,当我们新建一个 SpringBoot 项目时,而这个空项目一定会包含一个xxxxxxxxAutoconfigApplication.java的类,这是 SpringBoot 的启动类,而这个类一定存在@SpringBootApplication这个注解,那似乎就说明了这个注解和自动配置一定存在某些关系

​ 我们ctrl + 左键进入这个注解,会发现这是一个复合注解,一个很明显的名字@EnableAutoConfiguration启用自动配置就在其中,那很明显了,这个注解就是我们自动配置的开关所在,我们再进入这个注解

​ 随后我们会发现,@EnableAutoConfiguration是一个很简单的配置类,我们可以看到它存在一个@Import(AutoConfigurationImportSelector.class)注解,在使用注解配置 Spring 时,我们知道@Import注解是用来定义子配置文件的,并且从它导入的子配置类的名称(自动配置导入选择器)我们可以确定,有关自动配置的核心代码就在这个子配置类中

​ 通过查看这个类我们可以发现,SpringBoot 在selectImports方法中,通过调用同类下的getAutoConfigurationEntry方法来获取所谓的自动配置条目,那我们就继续来看一下这个方法

​ 这个方法中,我们可以注意到有一个configurations的变量,很明显,这是一个包含了配置的集合,这样我们就又找到了一个getCandidateConfigurations(得到候选的配置)方法,而在这个方法中,SpringBoot 又调用了SpringFactoriesLoader.loadFactoryNames,看起来我们离最最核心的代码越来越近了!点它!

​ 这时我们来到了SpringFactoriesLoader.java,在这个类中我们找到了loadFactoryNames方法,发现它关联了loadSpringFactories方法,这个方法中又一大坨代码

​ 我们可以看到,在loadSpringFactories这个方法中,SpringBoot 从FACTORIES_RESOURCE_LOCATION中获取值,通过获取到的值,将其中所有的条目都放入配置中,我们看一下这个值是个什么东西

​ 终于一坨一坨的代码变成了一个字符串,原来,SpringBoot 是从具有"META-INF/spring.factories"目录的 jar 包下获取自动配置资源的,我们找到spring-boot-auto-configure这个 jar 包,就会在它的目录下找到一个上述的路径,并找到spring.factories文件

​ 从上边的图片可以看到,这个文件中包含了很多什么什么自动配置类,原来,SpringBoot 把很多常用配置都已经编写成自动配置类,在启动项目时,SpringBoot 会通过扫描这个配置文件,获取到所有的自动配置类并加载到 Spring 容器中供我们使用

​ 那么自动配置类是如何被使用的呢?今天有点困了,下一篇再更!

-------------本文结束感谢您的阅读-------------