深入SpringBoot自动配置原理解析,一步步深入与理解
SpringBoot自动配置原理解析
本文将从一个最简单的web应用程序来分析springboot的自动配置原理。
1.下面是springboot的启动程序,标注了@SpringBootApplication注解,说明当前是一个Springboot程序2.我们点击@SpringBootApplication注解,进入其内部。
如上图红圈所示,@SpringBootConfiguration表示当前类是一个Springboot的配置类;@EnableAutoConfiguration表示开启自动配置功能。
我们还可以进入到@SpringBootConfiguration注解内部,其依赖的是spring的@Configuration注解。
3.探究@EnableAutoConfiguration注解,进入@EnableAutoConfiguration内部
如上图所示,主要依赖了两个注解@AutoConfigurationPackage和@Import。
[email protected]:该注解的主要作用是将主配置类(@SpringBootApplication标注的类)所在包及下面所有子包里面的所有组件扫描到Spring容器;
继续深入@AutoConfigurationPackage内部,我们看看是如何将相关类扫描到Spring容器的。
在@AutoConfigurationPackage内部使用了,其实@Import注解的作用就是导入组件。
我们进入AutoConfigurationPackages.Registrar,发现它是一个静态内部类。
该内部类有一个方法名为"注册Bean的定义",好像是说这个方法能够相关的Bean定义扫描的Spring容器中。打一个断点看看,到底注册了什么东西。
通过断点处的分析,可以看到通过new PackageImport(metadata).getPackageName()方法,计算出了一个结果:com.atguigu,这是我Springboot主程序所在的包。也就是说,这里将Springboot主程序所在包以及其子包的所有内容都注册到Springboot容器中了。
[email protected](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.总结