Spring Boot自动配置原理浅析

目录

 

一、什么是Spring Boot的自动配置?

二、三大注解

三、@EnableAutoConfiguration

四、@AutoConfigurationPackage

五、@Import


一、什么是Spring Boot的自动配置?

Spring Boot的最大的特点就是简化了各种xml配置内容,还记得曾经使用SSM框架时我们在spring-mybatis.xml配置了多少内容吗?数据源、连接池、会话工厂、事务管理···,而现在Spring Boot告诉你这些都不需要了,一切交给它的自动配置吧!

所以现在能大概明白什么是Spring Boot的自动配置了吗?简单来说就是用注解来对一些常规的配置做默认配置,简化xml配置内容,使你的项目能够快速运行。

是否对Spring Boot自动配置的原理感到好奇呢?下面我们将浅析Spring Boot的自动配置原理。

二、三大注解

在启动类中可以看到@SpringBootApplication注解,它是SpringBoot的核心注解,也是一个组合注解。我们进入这个注解可以看到里面又包含了其它很多注解,但其中@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan三个注解尤为重要。

Spring Boot自动配置原理浅析 Spring Boot自动配置原理浅析

@SpringBootConfiguration:继承自Configuration,支持JavaConfig的方式进行配置。

@EnableAutoConfiguration:本文重点讲解,主要用于开启自动配置。

@ComponentScan:自动扫描组件,可以指定扫描路径,Spring会把指定路径下带有指定注解的类注册到IOC容器中。

三、@EnableAutoConfiguration

看到这个名字,大家也应该能猜到这个注解的作用,没错,这个注解可以帮助我们自动加载程序所需的默认配置。要想搞清楚自动配置的原理,我们就要拿它开刀。

继续进入@EnableAutoConfiguration,注意到这两个注解:@AutoConfigurationPackage@Import

Spring Boot自动配置原理浅析

四、@AutoConfigurationPackage

我们先进入@AutoConfigurationPackage,发现它里面依然引用了@Import注解,继续进入AutoConfigurationPackages.Registrar.class,找到如图registerBeanDefinitions的方法。

Spring Boot自动配置原理浅析

Spring Boot自动配置原理浅析

可以看到这个方法包含两个参数metadataregistry。下面简单介绍下这两个参数。

metadata:用来获取启动类的信息,获取该类所在的包。

registry:用于bean注册。

可以大概知道这个方法是用于注册bean的定义的。

因此@AutoConfigurationPackage这个注解的作用是将添加该注解的类所在的包作为自动配置package进行管理。而该注解包含在@SpringBootApplication注解里面,所以SpringBoot应用启动时会将启动类所在的包作为自动配置的package。

五、@Import

再回到第三步的@Import(AutoConfigurationImportSelector.class)注解,不能放过它,继续进入AutoConfigurationImportSelector。可以看到所有的配置信息通过getCandidateConfigurations(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())得到,并最终由一个列表保存。我们继续查看getCandidateConfigurations()方法。

Spring Boot自动配置原理浅析
Spring Boot自动配置原理浅析

继续进入loadFactoryNames()方法,可以发现一个获取资源的可疑地址:FACTORIES_RESOURCE_LOCATION

Spring Boot自动配置原理浅析

再进入FACTORIES_RESOURCE_LOCATION,发现值为:META-INF/spring.factories

Spring Boot自动配置原理浅析

原来Spring启动的时候会扫描所有jar下的META-INF/spring.factories,将其包装成Properties对象,然后再从Properties对象中获取key值为:EnableAutoConfiguration的数据添加到容器中。

Spring Boot自动配置原理浅析

这里你可能会疑惑为什么key值为EnableAutoConfiguration不是其他的。回到之前的getCandidateConfigurations(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())方法,注意第一个参数,是一个方法,我们进入这个方法,发现返回的是EnableAutoConfiguration.class。可以得知第一个参数的作用就是用来确定key值的。

Spring Boot自动配置原理浅析

应用启动过程中会去解析EnableAutoConfiguration下面的这些类,将他们加入到容器中做自动配置。