深入SpringBoot自动配置原理解析,一步步深入与理解

SpringBoot自动配置原理解析

本文将从一个最简单的web应用程序来分析springboot的自动配置原理。

1.下面是springboot的启动程序,标注了@SpringBootApplication注解,说明当前是一个Springboot程序
在这里插入图片描述
2.我们点击@SpringBootApplication注解,进入其内部。
在这里插入图片描述如上图红圈所示,@SpringBootConfiguration表示当前类是一个Springboot的配置类;@EnableAutoConfiguration表示开启自动配置功能。

我们还可以进入到@SpringBootConfiguration注解内部,其依赖的是spring的@Configuration注解。

3.探究@EnableAutoConfiguration注解,进入@EnableAutoConfiguration内部

在这里插入图片描述
如上图所示,主要依赖了两个注解@AutoConfigurationPackage和@Import。

3.1@AutoConfigurationPackage:该注解的主要作用是将主配置类(@SpringBootApplication标注的类)所在包及下面所有子包里面的所有组件扫描到Spring容器;

继续深入@AutoConfigurationPackage内部,我们看看是如何将相关类扫描到Spring容器的。
在这里插入图片描述
在@AutoConfigurationPackage内部使用了,其实@Import注解的作用就是导入组件。

我们进入AutoConfigurationPackages.Registrar,发现它是一个静态内部类。
在这里插入图片描述
该内部类有一个方法名为"注册Bean的定义",好像是说这个方法能够相关的Bean定义扫描的Spring容器中。打一个断点看看,到底注册了什么东西。

在这里插入图片描述通过断点处的分析,可以看到通过new PackageImport(metadata).getPackageName()方法,计算出了一个结果:com.atguigu,这是我Springboot主程序所在的包。也就是说,这里将Springboot主程序所在包以及其子包的所有内容都注册到Springboot容器中了。

3.2@Import(EnableAutoConfigurationImportSelector.class)
通过上面我们知道,@Import的功能是导入组件,我们进入到导入的组件内部,看看该组件的作用。

在这里插入图片描述
EnableAutoConfigurationImportSelector继承了AutoConfigurationImportSelector,我们再进入它的父类。
在其父类AutoConfigurationImportSelector中有如下方法,该方法用于导入相关的组件,这些组件会被添加到容器中。

在这里插入图片描述通过源代码可知,最后将configurations集合转为数组返回了,所以该集合应该是存储了导入组件的信息。
我们通过断点的方式查看到底导入了哪些组件。

可以看到configurations集合大小为96,存储大量的与自动配置相关的配置类。有了这些自动配置类,就省去了我们麻烦的配置工作。
在这里插入图片描述
4.自动配置类是如何加载进来的

我们进入获取到configurations的getCandidateConfigurations()方法内部查看。

在这里插入图片描述
通过注释我们可以看到这里的返回值是候选配置的集合。

其内部主要调用了的是loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())方法。
参数一是字节码文件,参数二是类加载器。

我们再进入loadFactoryNames方法内部。
在这里插入图片描述其中 FACTORIES_RESOURCE_LOCATION的定义如下:
在这里插入图片描述Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作。

5.总结
在这里插入图片描述


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