SpringBoot自动装配原理[源码]

SpringBoot版本:2.3.2.RELEASE

1、首先我通过springboot主程序上唯一的注解@SpringBootApplication进入查看springboot源码

SpringBootApplication是SpringBoot的主要配置类,SpringBoot的main方法就是由这个类启动的而这个类上还配置了SpringBoot的几个核心注解:

@SpringBootConfiguration:标明这是一个SpringBoot的配置类 @EnableAutoConfiguration:让SpringBoot开启自动配置功能(非常重要!!!) @ComponentScan:开启SpringBoot扫描(这个扫描机制只会扫描到与主程序同级目录即之下的目录)

现在我们进入@EnableAutoConfiguration

这里也有两个需要注意的注解:

1. @AutoConfigurationPackage:自动配置包

@Import({AutoConfigurationPackages.Registrar.class}):底层注解,给容器导入组件; 将主配置类(@SpringBootApplication标注的类)的所在包及下面所有的子包里面的所有组件扫描到Spring容器

2.@Import( AutoConfigurationImportSelector.class)

AutoConfigurationImportSelector:SpringBoot自动导入配置选择器,SpringBoot自动加载配置就是在这个类的基础完成的

现在我们进入AutoConfigurationImportSelector类

我们通过DeBug调试可以查看到这个配置信息的List集合

仔细查看这些配置信息我们可以发现,所有的配置信息对应了类都是以AutoConfiguration结尾的,

那么这些配置信息SpringBoot又是从哪里获取的呢?

在SpringBoot依赖jar包中有一个自动加载配置jar包的文件 即META-INF目录下的spring.factories文件

在调试过程中我们随便copy了一个配置信息,在spring-factories文件中搜索,你会发现,只要是configurations属性下的配置信息,都可以看见,

当然,其中对应自动配置的类也在各自jar包下META-INF目录下的spring.factories文件中,而不是全都在spring-boot-autoconfigure-2.3.2.RELEASE.jar 包中

如上图configurations属性中的第一个值: org.springframework.boot.devtools.autoconfigure.DevToolsDataSourceAutoConfiguration 咱们按这个类所属的包名去找到对应的jar包,即可能是spring-boot-devtools包中的类,打开该jar包下的factories文件查看果然存在其中

那么为什么SpringBoot会读取META-INF下的factories文件呢

前面有说到有一个核心方法getCandidateConfigurations获取到了所有配置信息的List集合 List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);

那么这个方法内到底做了什么呢?

可以看到这里的一行关键代码

List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), 调用SpringFactoriesLoader类中的loadFactoryNames,我们进入到SpringFactoriesLoader类中 即SpringBoot在自动装配时会用到SpringFactoriesLoader类去读取factories文件中的配置内容

经验分享 程序员 微信小程序 职场和发展