Spr‎ing Boot‎自动装‎配原理源码分析

来源:kmgdwlc.com   作者:   发表时间:2020-02-15 15:01:01

使用IDEA Spring Initializr快速创建一个Spring Boot项目

添加一个Controller类

Spring Boot规定,项目的主配置类必须放在最外层包,也就是说,所有的类都必须放在主配置类的同级包或者子包里,这么做的用意是什么?我们点开@SpringBootApplication注解慢慢分析(下面代码中省略元注解)...

@SpringBootApplication内部标注了三个注解:

@SpringBootConfiguration

进入源码中可以看见,@SpringBootConfiguration其实就是Spring中的@Configuration,用于标注配置类

@ComponentScan

这个注解也是Spring中的,它用来将指定包下需要装配的组件注册到容器中

@EnableAutoConfiguration

接下来才是今天的重头戏,Spring Boot自动配置的主角!

​ 进入@EnableAutoConfiguration源码你会发现这个注解中标注了两个注解@AutoConfigurationPackage和@Import

在点进Register,这是一个静态内部类

我们在第一个方法处打一个断点debug一下,发现new PackageImport(metadata).getPackageName()的结果其实就是一个包名,这时我们很容易的可以想到,这个包就是Spring Boot主配置类所在的包

再看一眼metadata,果然,就是主配置类

因此,这个注解的作用就是将主配置类所在的包作为自动配置包进行管理

@Import的作用就是导入一个类到IOC容器,我们先来看一下导入的这个类:自动配置导入选择器

源码里有一个方法selectImports,选择导入

在点进getAutoConfigurationEntry,获取自动配置类

在getCandidateConfigurations方法处打一个断点,发现configurations的结果是所有的xxxAtuoConfiguration类,一共124个,请记住这个数字。

那么这些自动配置类是如何获取的呢,从哪里获取的呢?

我们继续点进getCandidateConfigurations,获取候选的配置

继续点,loadFactoryNames,加载工厂名,方法所在类中有一个常量FACTORIES_RESOURCE_LOCATION,看代码可以清晰的看到,这方法加载classpath下的所有jar包的META-INF/spring.factories文件,结果用一个HashMap存储

打开spring-boot-autoconfigure-2.2.4.RELEASE.jar/META-INF/spring.factories,文件部分类容如下,你可以点进去看看第22~145行,确实是124个全类名

编辑:

未经授权许可,不得转载或镜像
© Copyright © 1997-2019 by kmgdwlc.com all rights reserved